如何在Spring中连接相互依赖的bean?

时间:2009-01-08 17:02:53

标签: java spring dependency-injection

我想声明两个bean并使用Spring依赖注入实例化它们吗?

<bean id="sessionFactory" class="SessionFactoryImpl">
 <property name="entityInterceptor" ref="entityInterceptor"/>
</bean>

<bean id="entityInterceptor" class="EntityInterceptorImpl">
 <property name="sessionFactory" ref="sessionFactory"/>
</bean>

但Spring抛出一个异常,说“当前处于创建状态的FactoryBean从getObject返回null”

为什么相互依赖的bean连线在这里不起作用?我应该在任何地方指定defferred属性绑定吗?

4 个答案:

答案 0 :(得分:13)

不幸的是容器初始化在Spring中运行的方式,bean只有在完全初始化后才能注入另一个bean。在您的情况下,您有一个循环依赖项,可以防止bean被初始化,因为它们相互依赖。要解决这个问题,您可以在其中一个bean中实现BeanFactoryAware,并使用beanFactory.getBean(“beanName”)获取对另一个bean的引用。

答案 1 :(得分:3)

neesh是对的,Spring并不是开箱即用的。

相互依赖的bean暗示了设计问题。 “干净”的方法是重新设计您的服务,使其不存在这种奇怪的依赖关系,当然前提是您可以控制实现。

答案 2 :(得分:2)

答案 3 :(得分:0)

您可以扩展正在使用的ApplicactionContext并覆盖方法createBeanFactory()

 protected DefaultListableBeanFactory createBeanFactory(){
    DefaultListableBeanFactory beanFactory = super.createBeanFactory();
    // By default this is false;
    beanFactory.setAllowRawInjectionDespiteWrapping( true );
    return beanFactory;
 }

这有效,但要小心,因为这允许循环引用。