我有一组使用构造函数注入创建的Spring bean。由于(通过设计)循环引用其他bean,我想在创建bean之后对bean进行后处理,以便将引用注入其他bean。
使用BeanPostProcessor的初步尝试表明,在实例化EACH bean之后,BeanPostProcessor正在运行,而不是等到所有实例化完毕。
在创建所有bean后,Spring是否提供了一组后处理机制?
答案 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。