在运行时明确地获取bean的实例

时间:2010-11-24 23:03:34

标签: spring initialization javabeans

我有一个案例,我有一个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;
}

1 个答案:

答案 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.