spring 使用@Autowired注入與使用構造函數注入區別


使用介紹

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM