org.springframework.beans.factory.BeanCurrentlyInCreationException:Spring循环依赖 - 构造函数自动装配

时间:2017-05-19 07:37:50

标签: java spring

旧代码:

@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;
     }

我来了:

  

org.springframework.beans.factory.BeanCurrentlyInCreationException:   创建名为'someFactory'的bean时出错:请求的bean是   目前正在创作:是否存在无法解决的循环引用?

在通过构造函数自动装配时Spring是否存在一些问题?

1 个答案:

答案 0 :(得分:4)

检查Spring documentation(寻找'循环依赖关系')。

  

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

区别在于以下几点;

Setter injection 中,只有在需要时才会构造bean引用。使用@Required注释setter时,你可以用setter注入重新创建同样的问题,因为这将导致立即创建bean。

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

@Component
public class CircularClassA {

    private CircularClassB classB;

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

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