*@Autowired注入成員變量,利用field反射注入,要等類加載完了才注入bean;@Autowired注入構造方法中,利用構造器注入,有先后依賴關系;setter屬性注入,setter代碼冗長,不能將屬性設置為final。
private A a;
@Autowired
public c(A a) {
this.a= a;
}
和
@Autowired
private A a;
1、@autowired寫在變量上的注入要等到類完全加載完,才會將相應的bean注入。
寫在方法上是為了在構造方法中使用到該變量。寫到構造方法中,也就是有了先后的注入依賴關系。
2、第一個是通過構造器注入, 第二個是通過field反射注入
弊端
如果你使用的是構造器注入
恭喜你,當你有十幾個甚至更多對象需要注入時,你的構造函數的參數個數可能會長到無法想像。
如果你使用的是field反射注入
如果不使用Spring框架,這個屬性只能通過反射注入,太麻煩了!這根本不符合JavaBean規范。
還有,當你不是用過Spring創建的對象時,還可能引起NullPointerException。
並且,你不能用final修飾這個屬性。
如果你使用的是setter方法注入
那么你將不能將屬性設置為final。
兩者取其輕
Spring3.0官方文檔建議使用setter注入覆蓋構造器注入。
Spring4.0官方文檔建議使用構造器注入。
結論
如果注入的屬性是必選的屬性,則通過構造器注入。
如果注入的屬性是可選的屬性,則通過setter方法注入。
至於field注入,不建議使用。
3、一般用的是模型驅動,當模型不夠時,用屬性驅動,屬性驅動也就是這個setter注入,一般還是用
@Autowired
private A abc;
public setAbc(A a) {
this.a= a;
}
結合模型驅動用。
記住八字真言:“模型不夠,屬性來湊”。