Spring BeanCurrentlyInCreationException

时间:2017-03-11 06:11:25

标签: java spring dependency-injection

我有以下java配置类:

@Configuration
public class MyConfig {

    @Autowired
    private List<MyInterface> myInterfaces;

    @Bean
    public A a() {
        return new A();
    }

    @PostConstruct
    public void postConstruct() {
        a().setProperty(myInterfaces);
    }
}

每个MyInterface实现都依赖于bean A,我假设这是这个循环依赖的来源;然而,我的期望如下:

  1. 此配置类实例化A并将其添加到应用程序上下文
  2. MyInterface的实现已成功注入bean A
  3. 将MyInterface实现列表注入MyConfig
  4. @PostConstruct执行,在bean A上设置myInterfaces
  5. 任何人都可以了解我的哪些假设不正确?

1 个答案:

答案 0 :(得分:1)

您的代码中存在循环依赖关系:请记住MyConfig也是一个bean,因此需要实例化并自动连接。为了创建它,需要注入所有可用的MyInterface个实例,其中一个实例需要bean A,它由MyConfig的实例方法创建,依此类推。

如果您要在Spring Boot 1.4+中运行,您将获得此输出:

***************************
APPLICATION FAILED TO START
***************************

Description:

    The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  interfaceImpl defined in file [/.../InterfaceImpl.class] 
↑     ↓
|  myConfig (field private java.util.List demo.MyConfig.myInterfaces)
└─────┘

您有两种选择:

  • make public A a() { - &gt; public static A a() {(因此不需要通过MyConfig的实例方法创建bean A;
  • 使myInterfaces成为@Lazy依赖项(因此实际上只有在访问时才填充):例如:

    @Autowired @Lazy
    private List<MyInterface> myInterfaces;