使用介紹
1.@Autowired注入
@RestController @RequestMapping("/test") public class TestController { @Autowired private List<TestService> testServices; @Autowired private List<ChainAsbtract> chains; private ChainAsbtract target; }
2.構造器注入
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版本后就推薦使用構造器的方式的來注入fileld
官方推薦理由 單一職責: 當使用構造函數注入的時候,你會很容易發現參數是否過多,這個時候需要考慮你這個類的職責是否過大,考慮拆分的問題;而當使用@Autowired注入field的時候,不容易發現問題 依賴不可變: 只有使用構造函數注入才能注入final 依賴隱藏:使用依賴注入容器意味着類不再對依賴對象負責,獲取依賴對象的職責就從類抽離出來,IOC容器會幫你自動裝備。這意味着它應該使用更明確清晰的公用接口方法或者構造器,這種方式就能很清晰的知道類需要什么和到底是使用setter還是構造器 降低容器耦合度: 依賴注入框架的核心思想之一是托管類不應依賴於所使用的DI容器。換句話說,它應該只是一個普通的POJO,只要您將其傳遞給所有必需的依賴項,就可以獨立地實例化。這樣,您可以在單元測試中實例化它,而無需啟動IOC容器並單獨進行測試(使用一個可以進行集成測試的容器)。如果沒有容器耦合,則可以將該類用作托管或非托管類,甚至可以切換到新的DI框架。
另外,在使用構造器的使用能避免注入的依賴是空的情況。
因為在bean的生命周期里面先執行的是bean的構造器,然后才給bean里面的屬性賦值。
轉載自:https://blog.csdn.net/smilecjw/article/details/107669224