【问题标题】:org.springframework.beans.factory.BeanCurrentlyInCreationException: Spring cyclic dependency - constructor Autowiringorg.springframework.beans.factory.BeanCurrentlyInCreationException:Spring 循环依赖 - 构造函数自动装配
【发布时间】:2017-10-19 05:40:49
【问题描述】:

旧代码:

@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通过构造函数自动装配时会不会出现一些问题?

【问题讨论】:

  • 我想您定义了多个要注入的 SomeTransformer 类型的 bean?你能发布这些豆子的代码吗?您使用什么类型的配置? XML?注释了吗?
  • 是的,我可能有一些循环依赖,但我的问题是为什么它适用于旧代码?春天在这里如何运作?我不想修复循环,但知道在两种代码中解析 bean 有什么区别

标签: java spring


【解决方案1】:

检查Spring documentation(查找“循环依赖项”)。

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

区别在于以下几点;

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

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

@Component
public class CircularClassA {

    private CircularClassB classB;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多