春天的setter依赖注入已创建的所有豆后(Spring setter dependency inj

2019-09-20 04:35发布

我有一组创建Spring Bean中使用构造器注入的。 既然有(设计)的其他豆类循环引用,我想后处理,豆类,一旦他们都创造了注入到其他bean的引用。

在使用BeanPostProcessor的初步尝试表明,每个bean实例化后,没有等到一切都被实例化了BeanPostProcessor运行。

春天在什么提供了后处理的机制设置bean的全部已创建后?

Answer 1:

如果您正在创建ApplicationContext中的豆类,ApplicationContext的触发ApplicationEvents到任何注册ApplicationListener回调。 其中之一应该告诉你什么时候在上下文中的所有的豆子通过Spring被连接在一起。



Answer 2:

下面是文档说,关于循环依赖:

如果使用构造器注入,也可以创建一个循环依赖的情况。

例如:一类需要通过构造喷射的类B的实例,和B类通过构造注射需要类A的一个实例。 如果配置豆类A和B被注入到彼此,Spring IoC容器检测在运行时循环引用,并抛出一个BeanCurrentlyInCreationException。

一个可能的解决方法是编辑一些类的源代码,以通过设置器,而不是构造来配置。 或者,避免构造器注入,只使用setter注入。 换句话说,虽然不建议这样做,你可以配置setter注入循环依赖。

不同于典型的情况下(不具有循环依赖),豆A和豆乙力豆的一个之间的循环依赖于在被完全初始化本身被注入到其它现有(经典的鸡/蛋的情况)。

我只想用setter注入在这种情况下,还是尽量避免在首位的循环依赖。 另一种解决方案是使豆了BeanFactoryAware之一,并且在需要时参考从bean工厂查找其它豆。



文章来源: Spring setter dependency injection after all beans have been created