Java 春天怎么给豆子接线?

Java 春天怎么给豆子接线?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我想声明两个bean并使用Spring依赖项注入实例化它们 <bean id="sessionFactory" class="SessionFactoryImpl"> <property name="entityInterceptor" ref="entityInterceptor"/> </bean> <bean id="entityInterceptor" class="EntityInterceptorImpl"> <proper

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

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

尼什是对的,斯普林不是开箱即用的

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

您可以实现设置依赖关系的

或者

见科斯汀的回复:

见安德烈亚斯的答复:


您可以扩展正在使用的ApplicationContext并重写方法createBeanFactory()


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

当我尝试使用BeanA和BeanB这样的简单类时,我没有这个问题。我支持Sathish。您可以使用
BeanA
BeanB
来实现这一点,因此这个示例更为特殊。更好的是,不要硬编码
“beanName”
,而是使用Spring的
标记,以便工厂将bean名称注入
字符串
属性。我认为他的设计在这里没有问题(我们对问题和解决方案一无所知);这里的问题是如何处理由Spring容器管理的对象之间的循环依赖关系。答案是IMHO,不是这样的-除非你没有选择,因为实现不是你的,在这种情况下,这里提供的解决方案将起到作用。这两个服务要么只是一个服务,要么是第三个,高她的服务水平有待发现。
 protected DefaultListableBeanFactory createBeanFactory(){
    DefaultListableBeanFactory beanFactory = super.createBeanFactory();
    // By default this is false;
    beanFactory.setAllowRawInjectionDespiteWrapping( true );
    return beanFactory;
 }