其實在工做中使用了Spring這麼久,有不少的細節是值得使用者去思考的。如今筆者想針對Spring依賴注入的@Autowired總結一些想法。最近筆者看到一則實踐建言,建議Spring的依賴注入採用構造器的方式(下面會提到)。看到這條,難免心中會有疑惑,爲何?spring
先讓咱們來總結下,@Autowired的使用方式有哪些。根據文檔上的說明,@Autowired註解有三種經常使用方式。一種是在構造器的前面使用,後續咱們簡稱爲「constructor方式」;一種是在setter方法前面使用,後續簡稱爲「setter方式」;最後一種是直接在聲明的類屬性上使用,後續簡稱「field方式」。wordpress
相信看過Spring依賴注入示例代碼、項目源碼的人,對筆者上面提到的三種方式不會陌生,應該都有所見聞,並且應該知道@Autowired默認是依據類型來進行注入的。既然提供了三種方式,爲何那條建言推薦使用constructor方式呢?工具
筆者查閱了幾篇相關的歪果仁所寫的博客及帖子,其實能夠發現不少人對這三種方式的對比和取捨早已爭論不休,筆者大體總結了幾方面。測試
@Service public ProductionService { private final UserService userService; @Autowired public ProductionService(UserService userService){ this.userService = userService; } //...省略 }
優點:this
劣勢:.net
@Service public ProductionService { private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } //...省略 }
優點:code
劣勢:對象
@Service public ProductionService { @Autowired private UserService userService; //...省略 }
優點:文檔
劣勢:get
綜上所述,@Autowired的三種用法其實沒有所謂的孰優孰劣,筆者也就不在此提倡哪一種用法被噴了。使用者須要根據具體的應用場景,例如可變性的要求、「重塑性」的須要、測試時的方便、代碼結構合理性等等因素吧,採用適合本身的方式。
筆者在作上述內容的思考時,想到了另一個「話題」,不在本篇中敘述了,否則有些跑題。能夠先拋個引子,在後續博文中探討。「假設採用field方式注入bean,又想保證不可變性的話,可否把屬性設爲final呢?」
https://steveschols.wordpress.com/2012/06/05/i-was-wrong-constructor-vs-setter-injection/