spring-@Autowired注入與構(gòu)造函數(shù)注入使用方式
前言
因為業(yè)務(wù)關(guān)系也看了些同事寫的代碼,因為公司沒有明確規(guī)定,有一部分人在注入依賴的時候使用了用Spring推薦的構(gòu)造器注入的方式,一部分人使用了@Autowired的注解進行注入。
因此,接下來我試著總結(jié)歸納一下相關(guān)的情況,做一次回顧。
用自己的話去說出來才算是真的掌握。
使用介紹
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;
}
}事實上,spring在4.x版本后就推薦使用構(gòu)造器的方式的來注入fileld
官方推薦理由
- 單一職責:當使用構(gòu)造函數(shù)注入的時候,你會很容易發(fā)現(xiàn)參數(shù)是否過多,這個時候需要考慮你這個類的職責是否過大,考慮拆分的問題;而當使用@Autowired注入field的時候,不容易發(fā)現(xiàn)問題
- 依賴不可變:只有使用構(gòu)造函數(shù)注入才能注入final
- 依賴隱藏:使用依賴注入容器意味著類不再對依賴對象負責,獲取依賴對象的職責就從類抽離出來,IOC容器會幫你自動裝備。這意味著它應(yīng)該使用更明確清晰的公用接口方法或者構(gòu)造器,這種方式就能很清晰的知道類需要什么和到底是使用setter還是構(gòu)造器
- 降低容器耦合度:依賴注入框架的核心思想之一是托管類不應(yīng)依賴于所使用的DI容器。換句話說,它應(yīng)該只是一個普通的POJO,只要您將其傳遞給所有必需的依賴項,就可以獨立地實例化。這樣,您可以在單元測試中實例化它,而無需啟動IOC容器并單獨進行測試(使用一個可以進行集成測試的容器)。如果沒有容器耦合,則可以將該類用作托管或非托管類,甚至可以切換到新的DI框架。
另外,在使用構(gòu)造器的使用能避免注入的依賴是空的情況。
因為在bean的生命周期里面先執(zhí)行的是bean的構(gòu)造器,然后才給bean里面的屬性賦值。
具體內(nèi)容在bean的生命周期里面,后面我學習之后按照自己的理解寫寫。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot Maven 插件如何構(gòu)建可執(zhí)行 JAR 的核心
SpringBoot核心Maven插件,用于生成可執(zhí)行JAR/WAR,內(nèi)置服務(wù)器簡化部署,支持熱部署、多環(huán)境配置及依賴管理,提升開發(fā)效率與構(gòu)建靈活性,本文給大家介紹Spring Boot Maven 插件如何構(gòu)建可執(zhí)行JAR的核心配置,感興趣的朋友一起看看吧2025-07-07
SpringBoot3.x整合swagger的實現(xiàn)示例
本文主要介紹了SpringBoot3.x整合swagger的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-08-08
SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細過程
這篇文章給大家介紹了SpringBoot3.2.2整合MyBatis Plus3.5.5的詳細過程,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-01-01

