[英]How to wire Interdependent beans in Spring?
我想声明两个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接线在这里不起作用? 我应该在任何地方指定延迟属性绑定吗?
不幸的是,容器初始化在Spring中的工作方式是,一个bean必须在完全初始化后才能注入另一个bean。 在您的情况下,您有一个循环依赖关系,该关系阻止任何一个bean初始化,因为它们相互依赖。 为了解决这个问题,您可以在一个bean中实现BeanFactoryAware并使用beanFactory.getBean(“ beanName”)获得对另一个bean的引用。
neesh是正确的,Spring并没有开箱即用。
相互依赖的bean暗示了设计问题。 实现此目的的“干净”方法是重新设计服务,以确保没有这样的奇怪依赖关系,当然,前提是您可以控制实现。
您可以实现设置依赖项的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
您可以扩展正在使用的ApplicactionContext并覆盖方法createBeanFactory()
protected DefaultListableBeanFactory createBeanFactory(){
DefaultListableBeanFactory beanFactory = super.createBeanFactory();
// By default this is false;
beanFactory.setAllowRawInjectionDespiteWrapping( true );
return beanFactory;
}
这可行,但是要小心,因为这允许循环引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.