spring-@Autowired注入與構(gòu)造函數(shù)注入使用方式
前言
因?yàn)闃I(yè)務(wù)關(guān)系也看了些同事寫(xiě)的代碼,因?yàn)楣緵](méi)有明確規(guī)定,有一部分人在注入依賴的時(shí)候使用了用Spring推薦的構(gòu)造器注入的方式,一部分人使用了@Autowired的注解進(jìn)行注入。
因此,接下來(lái)我試著總結(jié)歸納一下相關(guān)的情況,做一次回顧。
用自己的話去說(shuō)出來(lái)才算是真的掌握。
使用介紹
1.@Autowired注入
@RestController @RequestMapping("/test") public class TestController { @Autowired private List<TestService> testServices; @Autowired private List<ChainAsbtract> chains; private ChainAsbtract target; }
2.構(gòu)造器注入
Spring4.3+之后,constructor注入支持非顯示注入方式。
@RestController @RequestMapping("/test") public class TestController { // @Autowired private final List<TestService> testServices; // @Autowired private final List<ChainAsbtract> chains; // @Autowired public TestController(List<TestService> testServices, List<ChainAsbtract> chains) { this.testServices = testServices; this.chains = chains; } }
3.setter注入
@RestController @RequestMapping("/test") public class TestController { // @Autowired private final List<TestService> testServices; // @Autowired private final List<ChainAsbtract> chains; @Autowired public void setTestServices(List<TestService> testServices){ this.testServices = testServices; } @Autowired public void setTestServices(List<ChainAsbtract> chains){ this.chains = chains; } }
事實(shí)上,spring在4.x版本后就推薦使用構(gòu)造器的方式的來(lái)注入fileld
官方推薦理由
- 單一職責(zé):當(dāng)使用構(gòu)造函數(shù)注入的時(shí)候,你會(huì)很容易發(fā)現(xiàn)參數(shù)是否過(guò)多,這個(gè)時(shí)候需要考慮你這個(gè)類(lèi)的職責(zé)是否過(guò)大,考慮拆分的問(wèn)題;而當(dāng)使用@Autowired注入field的時(shí)候,不容易發(fā)現(xiàn)問(wèn)題
- 依賴不可變:只有使用構(gòu)造函數(shù)注入才能注入final
- 依賴隱藏:使用依賴注入容器意味著類(lèi)不再對(duì)依賴對(duì)象負(fù)責(zé),獲取依賴對(duì)象的職責(zé)就從類(lèi)抽離出來(lái),IOC容器會(huì)幫你自動(dòng)裝備。這意味著它應(yīng)該使用更明確清晰的公用接口方法或者構(gòu)造器,這種方式就能很清晰的知道類(lèi)需要什么和到底是使用setter還是構(gòu)造器
- 降低容器耦合度:依賴注入框架的核心思想之一是托管類(lèi)不應(yīng)依賴于所使用的DI容器。換句話說(shuō),它應(yīng)該只是一個(gè)普通的POJO,只要您將其傳遞給所有必需的依賴項(xiàng),就可以獨(dú)立地實(shí)例化。這樣,您可以在單元測(cè)試中實(shí)例化它,而無(wú)需啟動(dòng)IOC容器并單獨(dú)進(jìn)行測(cè)試(使用一個(gè)可以進(jìn)行集成測(cè)試的容器)。如果沒(méi)有容器耦合,則可以將該類(lèi)用作托管或非托管類(lèi),甚至可以切換到新的DI框架。
另外,在使用構(gòu)造器的使用能避免注入的依賴是空的情況。
因?yàn)樵赽ean的生命周期里面先執(zhí)行的是bean的構(gòu)造器,然后才給bean里面的屬性賦值。
具體內(nèi)容在bean的生命周期里面,后面我學(xué)習(xí)之后按照自己的理解寫(xiě)寫(xiě)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼
java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-03-03logback使用MDCFilter日志過(guò)濾源碼解讀
這篇文章主要介紹了logback使用MDCFilter日志過(guò)濾源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java.lang.OutOfMemoryError 錯(cuò)誤整理及解決辦法
這篇文章主要介紹了java.lang.OutOfMemoryError 錯(cuò)誤整理及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-10-10Javaweb監(jiān)聽(tīng)器實(shí)例之統(tǒng)計(jì)在線人數(shù)
這篇文章主要為大家詳細(xì)介紹了Javaweb監(jiān)聽(tīng)器實(shí)例之統(tǒng)計(jì)在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11MyBatis配置的應(yīng)用與對(duì)比jdbc的優(yōu)勢(shì)
這篇文章主要介紹了MyBatis配置的使用與相對(duì)于jdbc的優(yōu)勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07如何用Java Stream寫(xiě)出既高雅又裝*的代碼
如何讓同事看不懂你寫(xiě)的代碼,然后覺(jué)得你非常牛逼,這里用到了stream()與Lambda,需要有點(diǎn)基礎(chǔ),沒(méi)基礎(chǔ)你炫個(gè)🔨優(yōu)雅永不過(guò)時(shí)~ 看下面文章時(shí)記得穿燕尾服,拿高腳杯2021-08-08