我有一组使用构造函数注入创建的 Spring bean。由于(按设计)存在对其他 bean 的循环引用,因此我想在创建完所有 bean 后对它们进行后处理,以注入对其他 bean 的引用。
使用 BeanPostProcessor 的初始尝试表明 BeanPostProcessor 在每个 bean 被实例化后运行,而不是等到所有 bean 都被实例化。
Spring 是否在创建完一组 bean 之后提供了一种后处理机制?
我有一组使用构造函数注入创建的 Spring bean。由于(按设计)存在对其他 bean 的循环引用,因此我想在创建完所有 bean 后对它们进行后处理,以注入对其他 bean 的引用。
使用 BeanPostProcessor 的初始尝试表明 BeanPostProcessor 在每个 bean 被实例化后运行,而不是等到所有 bean 都被实例化。
Spring 是否在创建完一组 bean 之后提供了一种后处理机制?
如果您在 ApplicationContext 中创建 bean,ApplicationContext 会触发 ApplicationEvents 到任何已注册的 ApplicationListener 回调。其中之一应该告诉您上下文中的所有 bean 何时通过 Spring 连接在一起。
以下是文档中有关循环依赖项的说明:
如果您主要使用构造函数注入,则可能会创建无法解决的循环依赖场景。
例如:A类通过构造函数注入需要B类的实例,B类通过构造函数注入需要A类的实例。如果为类 A 和 B 配置 bean 以相互注入,Spring IoC 容器会在运行时检测到此循环引用,并抛出 BeanCurrentlyInCreationException。
一种可能的解决方案是编辑某些类的源代码以由设置器而不是构造器配置。或者,避免构造函数注入并仅使用 setter 注入。也就是说,虽然不推荐,但是可以通过setter注入来配置循环依赖。
与典型情况(没有循环依赖)不同,bean A 和 bean B 之间的循环依赖会强制其中一个 bean 在完全初始化之前注入另一个 bean(典型的鸡/蛋场景)。
在这种情况下,我只会使用 setter 注入,或者首先尝试避免循环依赖。另一种解决方案是使其中一个 bean 成为 BeanFactoryAware,并在需要引用时从 bean 工厂中查找另一个 bean。