当前位置: 首页 > 知识库问答 >
问题:

组织。springframework。豆。工厂BeanCurrentlyIncremationException:Spring循环依赖-构造函数自动连接

柴泰平
2023-03-14

代码

@Component("someFactory")
public class SomeFactoryImpl implements SomeFactory{

    @Autowired
    private List<SomeTransformer<?, ?>> someTransformers;

新代码:

@Component("someFactory")
public class SomeFactoryImpl implements SomeFactory {

    private List<SomeTransformer<?, ?>> someTransformers;

    @Autowired
    public SomeFactoryImpl(List<SomeTransformer<?, ?>> someTransformers) {
        this.someTransformers = someTransformers;
     }

这里我得到了:

组织。springframework。豆。工厂BeanCurrentlyIncremationException:创建名为“someFactory”的bean时出错:请求的bean当前正在创建中:是否存在无法解析的循环引用?

当通过构造函数自动连接时,Spring是否存在一些问题?

共有1个答案

章涵容
2023-03-14

查看Spring文档(查找“循环依赖项”)。

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

区别在于:;

在Setter注入中,bean引用仅在需要时构造。当用@Required注释setter时,您可能会重新创建setter注入的相同问题,因为这将导致立即创建bean。

在构造函数注入中,Spring无法决定应该首先创建哪个bean,因为它们相互依赖。问题立即暴露出来。一种可能的解决方法是使用带@Lazy;

@Component
public class CircularClassA {

    private CircularClassB classB;

    @Autowired
    public CircularDependencyB(@Lazy CircularClassB classB) {
        this.classB = classB;
    }
}

这将只创建类B的代理,而不是完全初始化它。它在需要时被完全初始化,就像setter注入一样。

 类似资料: