簡體   English   中英

為什么 Spring DependsOn 注釋不能用於自動連接接口

[英]Why Spring DependsOn annotation cannot use to auto wire an interface

當我正在編寫一些 spring 代碼時,我將 spring 4 與 class 和 annotation-config 一起使用。 我已經聲明了一個 bean 將一個接口實現為一個組件。 我正在嘗試使另一個 bean 依賴於它的接口時間。 但它不起作用,因為 spring 拋出一個錯誤,沒有在該名稱中找到 bean。 我認為這可能是因為取決於僅適用於具體類自動線,但我不知道為什么要這樣設置? 有沒有人可以解釋為什么依賴注釋不允許類型自動連接到接口?

簡單的示例代碼是這樣的

@Component
class A implement B{
}

@Component
@DependsOn("B")
class C {
}

上面的代碼不能工作,除非更改@DependsOn("B")@DependsOn("A")

一般來說,永遠不應該使用DependsOn 如果你需要它,你可能做錯了什么,或者你有一個極端的極端情況。 我從 2006 年開始使用 Spring,現在還不需要它。

JavaDoc 說

在 bean不通過屬性或構造函數參數顯式依賴另一個bean 而是依賴另一個 bean 初始化的副作用的情況下,很少使用。

這基本上意味着只有在您或其他人編寫了錯誤代碼時才使用DependsOn 例如,一個 beans 構造函數在磁盤上創建另一個 bean 在構造時需要的資源。 Springs IoC 容器和聲明式接線使您可以控制 bean 之間的依賴關系,但在極少數情況下,某些遺留代碼具有未聲明的依賴關系, DependsOn允許您控制構造無關的 spring bean 的順序。

對於簡單的自動@Autowired ,在字段或構造函數上使用@Autowired Spring 4.3開始,您可以在使用構造函數注入時省略@Autowired

@Component
class A implement B {
}

@Component
class C {
    private final B b;

    public C(B b) {
        this.b = b;
    }
}

當我嘗試使用依賴時我遇到了同樣的問題,但是經過我的研究,我發現最好的方法是在類 C 構造函數中刪除 B 的依賴,並在@PostConstruct注釋的方法init使用此邏輯,因此在初始化之后將執行此方法的所有構造函數。 希望我的回答對你有幫助。

暫無
暫無

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

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