Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开发JavaAPI并将其包含在Spring应用程序中_Java_Spring_Api_Initialization_Applicationcontext - Fatal编程技术网

开发JavaAPI并将其包含在Spring应用程序中

开发JavaAPI并将其包含在Spring应用程序中,java,spring,api,initialization,applicationcontext,Java,Spring,Api,Initialization,Applicationcontext,我们有一个基于Spring的大型应用程序,它包括不同的模块,但也包含自定义API。虽然有些模块需要Spring上下文,因为它们只包装域模型的一部分,但我们认为我们的一些API不需要 例如,我们围绕Jackson/Jersey编写了一个包装器来提供和使用REST服务。有一个访问此API的中央接口。然而,实现需要另一个类,而这又需要另一个类,以此类推。因此,一个简单的初始化是 A a = new A(new B(new C(), new D(new E()))) 我们当前通过使用@Inject保存

我们有一个基于Spring的大型应用程序,它包括不同的模块,但也包含自定义API。虽然有些模块需要Spring上下文,因为它们只包装域模型的一部分,但我们认为我们的一些API不需要

例如,我们围绕Jackson/Jersey编写了一个包装器来提供和使用REST服务。有一个访问此API的中央接口。然而,实现需要另一个类,而这又需要另一个类,以此类推。因此,一个简单的初始化是

A a = new A(new B(new C(), new D(new E())))
我们当前通过使用
@Inject
保存的。此API的上下文扫描包,然后导入目标应用程序

<import resource="classpath:api-context.xml" />
然后在我的目标上下文中,如果我想使用默认配置,我可以用一行初始化中央访问

<bean id="a" class="...A" />

从测试的角度来看,后者感觉最好,但它让我们回到了我上面描述的链,在初始化A之前,我必须初始化上下文中所有依赖的bean。这感觉像是太多的配置开销


有人可能会说,在使用类之前,所有依赖项都需要初始化,我们应该重构代码,这是很正常的。然而,我们最终会得到许多实用程序/帮助程序类,它们也不是最好的设计,因为它们很难替换或测试。

基本上,如果您的API不需要Spring上下文,就没有理由将其放在那里

请注意,您建议的第二种方法:

public class A implements AInterface {
    private BInterface b = new B();
    public getB() {return b;}
    public setB(B b) {this.b = b) }
}

这有点问题,因为您在类内初始化接口,这将导致测试问题,因为您无法模拟这些对象。更好的解决方案是在使用它的类的构造函数中初始化它。

基本上,如果您的API不需要Spring上下文,那么就没有理由将它放在那里

请注意,您建议的第二种方法:

public class A implements AInterface {
    private BInterface b = new B();
    public getB() {return b;}
    public setB(B b) {this.b = b) }
}

这有点问题,因为您在类内初始化接口,这将导致测试问题,因为您无法模拟这些对象。更好的解决方案是在使用它的类的构造函数中初始化它。

只需定义默认情况下要惰性加载的所有bean,然后就不会实例化不使用的服务

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>


有关更多详细信息,请参阅。

只需定义默认情况下要延迟加载的所有bean,就不会实例化不使用的服务

<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>


有关更多详细信息,请参阅。

我真的不确定您所说的“想要将spring上下文从REST包装中踢出”是什么意思,而且我也不确定您是如何使用上下文的。上下文不必映射到包或API,但可以是包含应用程序的任何bean分组。如果您不想使用包扫描,那么您别无选择,只能使用XML或
@Configuration
单独定义bean,并在该配置中指定bean之间的引用,或者使用@Autowired或等效工具。我真的不确定您所说的“想将spring上下文踢出REST包装器”是什么意思,我也不确定你是如何使用上下文的。上下文不必映射到包或API,但可以是包含应用程序的任何bean分组。如果您不想使用包扫描,那么您别无选择,只能使用XML或
@Configuration
单独定义bean,并在该配置中指定bean之间的引用,或者使用@Autowired或等效工具。是的,测试确实是我们关心的问题,不过我认为,通过使用getter/setter,我们可以模拟该类。。但是,使用构造函数参数,我们将得到我描述的链
aa=newa(newb(newc(…))
这主要取决于您的实现,如果您可以使用延迟加载(仅在需要时初始化类),那么您可以在不使用B的情况下初始化A,然后仅在需要时初始化B(使用setter)等等。是的,测试确实是我们关心的问题,虽然通过使用getter/setter我们可以模拟这个类,但我认为。。但是,使用构造函数参数,我们将得到我描述的链
aa=newa(newb(newc(…))
这主要取决于您的实现,如果您可以使用延迟加载(仅在需要时初始化类),那么您可以在不使用B的情况下初始化A,然后仅在需要时初始化B(使用setter),依此类推。
public class A implements AInterface {
    private BInterface b = new B();
    public getB() {return b;}
    public setB(B b) {this.b = b) }
}
<beans default-lazy-init="true">
    <!-- no beans will be pre-instantiated... -->
</beans>