旧代码:
@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是否存在一些问题?
答案 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注入一样。