[英]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.