咱們在使用Spring框架進行開發時,不可避免的要進行依賴注入(Dependency Injection),也就是把實例從Spring容器中取出來進行使用。Spring的依賴注入方式主要有三種,分別爲Constructor、Setter和Field。有了選擇的餘地,使人糾結的地方就來了,這三種方式哪一個更好一些呢?安全
接下來咱們逐一看下這三種注入方式:框架
@Autowired private DependencyA dependencyA;
函數
依賴不能是final的測試
容易出現循環依賴this
private DependencyB dependencyB; @Autowired public void setDependencyB(DependencyB dependencyB) { this.dependencyB = dependencyB; }
private DependencyC dependencyC; @Autowired public DI(DependencyC dependencyC) { this.dependencyC = dependencyC; }
依賴能夠是final的spa
高耦合類隨着構造參數的增加很容易被識別出來線程
不須要依賴@Autowired註解(當類中只有一個構造方法時,能夠省略@Autowired)指針
Spring官方目前推薦的是構造器注入。根據官方的說法,由於它令人們可以將應用程序組件實現爲不可變對象,並確保所需的依賴項不爲null。此外,注入構造函數的組件老是以徹底初始化的狀態返回到客戶端(調用)代碼。code
不可變對象:說的是能夠是字段用final關鍵字修飾。對象
依賴不爲null:由於有了自定義的構造函數,因此程序再也不提供默認的空參構造,類在實例化時必須傳入全部須要的參數。
徹底初始化的狀態:構造方法的做用就是初始化成員變量,在Java類加載實例化的過程當中,構造方法是最後一步,因此返回來的組件都是初始化以後的狀態。
三種方式各有利弊,從靠譜程度來講,仍是構造器注入更好一些,它能有效避免一些好比循環依賴、空指針等異常的發生。另外,Spring中Bean默認爲單例的,有可能會出現線程安全問題,這個時候final就更有必要了。固然,其餘兩種方式也有其本身的發光點,咱們能夠按實際須要選擇使用,或混合使用。