19

我想声明两个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 布线在这里不起作用?我应该在任何地方指定延迟属性绑定吗?

4

4 回答 4

13

不幸的是容器初始化在 Spring 中的工作方式,一个 bean 只能在完全初始化后注入另一个 bean。在您的情况下,您有一个循环依赖关系,它会阻止初始化任何一个 bean,因为它们相互依赖。为了解决这个问题,您可以在其中一个 bean 中实现 BeanFactoryAware,并使用 beanFactory.getBean("beanName") 获取对另一个 bean 的引用。

于 2009-01-08T17:10:22.027 回答
3

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

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

于 2009-01-08T17:23:13.750 回答
2

您可以实现设置依赖项的BeanPostProcessor

或者...

请参阅 Costin 的回复:

http://forum.springframework.org/showthread.php?t=19569&highlight=circular+dependencies

在此处查看 Andreas 的回复:

http://forum.springframework.org/showthread.php?t=29572&highlight=circular+dependencies

于 2009-01-08T17:34:50.090 回答
0

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

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

这可行,但要小心,因为这允许循环引用。

于 2009-01-08T20:30:35.587 回答