簡體   English   中英

Spring BeanCurrentlyInCreationException

[英]Spring BeanCurrentlyInCreationException

我有以下java config類:

@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

誰能闡明我的哪個假設不正確?

您的代碼中有一個循環依賴性:請記住, 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)
└─────┘

您有兩種選擇:

  • 使public A a() { -> public static A a() { (因此不需要通過MyConfig的實例方法創建bean A);
  • 使myInterfaces成為@Lazy依賴項(因此實際上僅在訪問時填充):例如

     @Autowired @Lazy private List<MyInterface> myInterfaces; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM