簡體   English   中英

org.springframework.beans.factory.BeanCurrentlyInCreationException:Spring循環依賴項-構造函數自動裝配

[英]org.springframework.beans.factory.BeanCurrentlyInCreationException: Spring cyclic dependency - constructor Autowiring

舊代碼:

@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是否會有一些問題?

查看Spring文檔 (查找“循環依賴項”)。

與典型情況(沒有循環依賴關系)不同,bean A和bean B之間的循環依賴關系迫使其中一個bean在完全初始化之前被注入另一個bean(經典的chicken / egg場景)。

區別在於以下內容;

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注入一樣,它在需要時會完全初始化。

暫無
暫無

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

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