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

Posted

技术标签:

【中文标题】如何在 Spring 中连接相互依赖的 bean?【英文标题】:How to wire Interdependent beans in Spring? 【发布时间】:2012-10-19 17:06:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

当我尝试使用像 BeanA 和 BeanB 这样的简单类时,我没有遇到这个问题。 我第二个 Sathish。你可以用BeanABeanB 来做这件事,所以这个例子更特别。 更好的是,不要硬编码"beanName",而是使用Spring的&lt;idref&gt;标签,以便工厂将bean-name注入String属性。【参考方案2】:

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

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

【讨论】:

我认为他的设计在这里没有问题(我们对问题和解决方案一无所知);这里的问题是如何处理 Spring 容器管理的对象之间的循环依赖关系。 而且恕我直言,答案不是——除非你别无选择,因为实施不是你的,在这种情况下,这里提供的解决方案可以解决问题。这两个服务要么只是一个服务,要么还有第三个更高级别的服务等待被发现。【参考方案3】:

您可以实现设置依赖关系的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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于如何在 Spring 中连接相互依赖的 bean?的主要内容,如果未能解决你的问题,请参考以下文章

spring如何开启允许循环依赖

spring如何解决循环依赖

spring IoC Bean的依赖检查

深谈Spring如何解决Bean的循环依赖

spring bean 生命周期和作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理

Spring中-IOC-Bean的初始化-循环依赖的解决