我有一个案例,我有一个bean(我们称之为A)需要一些其他bean(B)。
使用MethodInvokingFactoryBean从类的静态方法中检索此B. 此静态方法取决于系统的状态,并在加载Web应用程序后起作用。
我只需要在运行时访问B(在构造函数中没有交互)。 如何将A配置为autowire bean B并仅在A第一次需要时对其进行初始化?
在Application上下文中使用getBean是唯一的方法吗?
谢谢!
* 编辑 - 添加了一些xmls :) *
这是bean B的定义。
<bean id="api" class="com.foo.API"/>
<bean id="B" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true">
<property name="targetObject" ref="api"/>
<property name="targetMethod" value="getFactory"/>
<qualifier value="myQualifer"/>
</bean>
这是bean A的定义。
<bean id="resources.someRESTResourceA" class="com.foo.MyRestResource"/>
我无法使用Autowire将B连接到A,因为它会在A的构造上初始化它(B)。
B的targetMethod仅在初始化Web应用程序后才能使用。 我可以在A中使用ApplicationContext.getBean(“B”),但它不优雅,并且在单元测试时会出现问题,除非我执行以下操作(这也是不需要的):
public BInterface getB() {
if (b == null) {
b = ApplicationContext.getBean("B");
}
return b;
}
答案 0 :(得分:1)
你应该懒洋洋地初始化bean A.
<bean id="A" class="demo.A" lazy-init="true">
<property name="b" ref="B"/>
</bean>
当您需要使用getBean()
方法时,仍需要从Spring容器中检索Bean A.使用ApplicationContextAware界面可以轻松访问它。
如果你将bean A自动装入另一个bean并且在构造bean B之前检索了bean,那么Spring容器将在它作为属性注入到另一个bean时创建bean A.