如何在春天连接相互依赖的豆子?

2022-09-02 13:37:47

我想声明两个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 属性绑定吗?


答案 1

不幸的是,容器初始化在Spring中的工作方式是,一个bean只有在完全初始化后才能注入另一个Bean中。在你的例子中,你有一个循环依赖关系,它阻止任何一个bean被初始化,因为它们相互依赖。要解决此问题,您可以在其中一个beanFactoryAware中实现BeanFactoryAware,并使用beanFactory.getBean(“beanName”)获取对另一个Bean的引用。


答案 2

neesh是对的,Spring不会开箱即用地做到这一点。

相互依赖的bean暗示了设计问题。执行此操作的“干净”方法是重新设计您的服务,这样就不会有这种奇怪的依赖关系,当然前提是您可以控制实现。


推荐