一、前言
我們在使用Spring框架進行開發時,不可避免的要進行依賴注入(Dependency Injection),也就是把例項從Spring容器中取出來進行使用。Spring的依賴注入方式主要有三種,分別為Constructor、Setter和Field。有了選擇的餘地,令人糾結的地方就來了,這三種方式哪個更好一些呢?
二、注入方式對比接下來我們逐一看下這三種注入方式:
Field注入
@Autowiredprivate DependencyA dependencyA;
優點
注入簡單,只需在欄位上新增@Autowired或@Resource;減少大量冗餘程式碼,美觀;新增Field時不需要過多程式碼修改;缺點
很難測試,因為沒有帶參構造和set方法,難以在容器以外使用。依賴不能是final的容易出現迴圈依賴Setter注入
private DependencyB dependencyB;@Autowiredpublic void setDependencyB(DependencyB dependencyB) { this.dependencyB = dependencyB;}
優點
對迴圈依賴免疫在物件的整個生命週期內,可以隨時動態的改變依賴。缺點
依賴不能是final的Constructor注入
private DependencyC dependencyC;@Autowiredpublic DI(DependencyC dependencyC) { this.dependencyC = dependencyC;}
優點
依賴可以是final的高耦合類隨著構造引數的增長很容易被識別出來不需要依賴@Autowired註解(當類中只有一個構造方法時,可以省略@Autowired)缺點
程式碼顯得十分臃腫三、選擇哪種注入方式Spring官方目前推薦的是構造器注入。根據官方的說法,因為它使人們能夠將應用程式元件實現為不可變物件,並確保所需的依賴項不為null。此外,注入建構函式的元件總是以完全初始化的狀態返回到客戶端(呼叫)程式碼。
不可變物件:說的是可以是欄位用final關鍵字修飾。依賴不為null:因為有了自定義的建構函式,所以程式不再提供預設的空參構造,類在例項化時必須傳入所有需要的引數。完全初始化的狀態:構造方法的作用就是初始化成員變數,在Java類載入例項化的過程中,構造方法是最後一步,所以返回來的元件都是初始化之後的狀態。四、總結三種方式各有利弊,從靠譜程度來說,還是構造器注入更好一些,它能有效避免一些比如迴圈依賴、空指標等異常的發生。另外,Spring中Bean預設為單例的,有可能會出現執行緒安全問題,這個時候final就更有必要了。當然,其他兩種方式也有其自己的發光點,我們可以按實際需要選擇使用,或混合使用。
歡迎做Java的朋友們私信我【資料】免費獲取免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
其中覆蓋了網際網路的方方面面,期間碰到各種產品各種場景下的各種問題,很值得大家借鑑和學習,擴充套件自己的技術廣度和知識面。