爲何要使用構造方法進行依賴注入

1、前言

咱們在使用Spring框架進行開發時,不可避免的要進行依賴注入(Dependency Injection),也就是把實例從Spring容器中取出來進行使用。Spring的依賴注入方式主要有三種,分別爲Constructor、Setter和Field。有了選擇的餘地,使人糾結的地方就來了,這三種方式哪一個更好一些呢?安全

2、注入方式對比

接下來咱們逐一看下這三種注入方式:框架

Field注入

@Autowired
private DependencyA dependencyA;

優勢

  • 注入簡單,只需在字段上添加@Autowired或@Resource;
  • 減小大量冗餘代碼,美觀;
  • 新增Field時不須要過多代碼修改;

缺點

  • 很難測試,由於沒有帶參構造和set方法,難以在容器之外使用。函數

  • 依賴不能是final的測試

  • 容易出現循環依賴this

Setter注入

private DependencyB dependencyB;
@Autowired
public void setDependencyB(DependencyB dependencyB) {
    this.dependencyB = dependencyB;
}

優勢

  • 對循環依賴免疫
  • 在對象的整個生命週期內,能夠隨時動態的改變依賴。

缺點

  • 依賴不能是final的

Constructor注入

private DependencyC dependencyC;
@Autowired
public DI(DependencyC dependencyC) {
    this.dependencyC = dependencyC;
}

優勢

  • 依賴能夠是final的spa

  • 高耦合類隨着構造參數的增加很容易被識別出來線程

  • 不須要依賴@Autowired註解(當類中只有一個構造方法時,能夠省略@Autowired)指針

缺點

  • 代碼顯得十分臃腫

3、選擇哪一種注入方式

Spring官方目前推薦的是構造器注入。根據官方的說法,由於它令人們可以將應用程序組件實現爲不可變對象,並確保所需的依賴項不爲null。此外,注入構造函數的組件老是以徹底初始化的狀態返回到客戶端(調用)代碼。code

  • 不可變對象:說的是能夠是字段用final關鍵字修飾。對象

  • 依賴不爲null:由於有了自定義的構造函數,因此程序再也不提供默認的空參構造,類在實例化時必須傳入全部須要的參數。

  • 徹底初始化的狀態:構造方法的做用就是初始化成員變量,在Java類加載實例化的過程當中,構造方法是最後一步,因此返回來的組件都是初始化以後的狀態。

4、總結

三種方式各有利弊,從靠譜程度來講,仍是構造器注入更好一些,它能有效避免一些好比循環依賴、空指針等異常的發生。另外,Spring中Bean默認爲單例的,有可能會出現線程安全問題,這個時候final就更有必要了。固然,其餘兩種方式也有其本身的發光點,咱們能夠按實際須要選擇使用,或混合使用。

相關文章
相關標籤/搜索