创建所有bean之后的Spring setter依赖注入

时间:2012-07-25 17:43:56

标签: spring post-processing

我有一组使用构造函数注入创建的Spring bean。由于(通过设计)循环引用其他bean,我想在创建bean之后对bean进行后处理,以便将引用注入其他bean。

使用BeanPostProcessor的初步尝试表明,在实例化EACH bean之后,BeanPostProcessor正在运行,而不是等到所有实例化完毕。

在创建所有bean后,Spring是否提供了一组后处理机制?

2 个答案:

答案 0 :(得分:2)

如果要在ApplicationContext中创建bean,ApplicationContext会将ApplicationEvents触发到任何已注册的ApplicationListener回调。其中一个应该告诉你上下文中的所有bean是通过Spring连接在一起的。

答案 1 :(得分:0)

这是the documentation关于循环依赖关系的内容:

  

如果您主要使用构造函数注入,则可以   创建一个无法解析的循环依赖场景。

     

例如:A类需要B类的实例   构造函数注入,而类B需要类A的实例   通过构造函数注入。如果为类A配置bean   和I B相互注入,Spring IoC容器检测到   这个循环引用在运行时,并抛出一个   BeanCurrentlyInCreationException。

     

一种可能的解决方案是编辑某些类的源代码   由setter而不是构造函数配置。或者,避免   构造函数注入和仅使用setter注入。换一种说法,   虽然不推荐,但您可以配置循环   与setter注入的依赖关系。

     

与典型案例(没有循环依赖关系)不同,是一个循环   bean A和bean B之间的依赖关系强制其中一个bean   在完全初始化之前注入另一个(a   经典的鸡肉/鸡蛋情景)。

在这种情况下我只会使用setter注入,或者首先尝试避免循环依赖。另一个解决方案是创建一个Bean BeanFactoryAware,并在需要引用时从bean工厂查找另一个bean。