1. 程式人生 > >Spring IOC三種注入方式(介面注入、setter注入、構造器注入)

Spring IOC三種注入方式(介面注入、setter注入、構造器注入)

IOC ,全稱 (Inverse Of Control) ,中文意思為:控制反轉, Spring框架的核心基於控制反轉原理。

什麼是控制反轉?
控制反轉是一種將元件依賴關係的建立和管理置於程式外部的技術。
由容器控制程式之間的關係,而不是由程式碼直接控制
由於控制權由程式碼轉向了容器,所以稱為反轉

物件與物件之間的關係可以簡單的理解為物件之間的依賴關係:
依賴關係:在 A 類需要類 B 的一個例項來進行某些操作,比如在類 A 的方法中需要呼叫類 B 的方法來完成功能,叫做 A 類依賴於B 類。

一個需要特定的依賴的元件一般會涉及一個依賴物件,在 IOC 的概念中叫做目標 (target) 。換句話說, IOC提供了這樣的服務,使一個元件能夠在它的整個生命週期中訪問它的依賴和服務,用這種方法與它的依賴進行互動。總的來說, IOC能夠被分解為兩種子型別:依賴注入和依賴查詢。

(1) 依賴查詢
比如使用 JNDI 註冊一個數據庫連線池的示例中,程式碼中從註冊處獲得依賴關係的 JNDI 查詢 (JNDI lookups):

CODE:
initContext = new InitialContext();
// 獲取資料來源
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/mysql");
(2) 依賴注入
(Dependency Injection) 依賴注入:兩個物件之間的依賴關係在程式執行時由外部容器動態的注入依賴行為方式稱為依賴注入(DI) 。 DI 是 IOC 的一種形式。

IoC 在應用開發中是一個非常有力的概念。如 Martin Flower 所述, IoC的一種表現形式就是依賴性注射。依賴性注射用的是好萊塢原則, " 不要找我,我會找你的。 "。換句來說,你的類不會去查詢或是例項化它們所依賴的類。控制恰好是反過來的,某種容器會設定這種依賴關係。使用 IoC常常使程式碼更加簡潔,並且為相互依賴的類提供一種很好的方法。

依賴注入的三種實現型別:介面注入、 Setter 注入和構造器注入。
<1> 介面注入 (Type1)

CODE:
public class ClassA {
private InterfaceB clzB;
public void doSomething() {
Ojbect obj=Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt()
}
……
}
上面的程式碼中, ClassA 依賴於 InterfaceB 的實現,如何獲得 InterfaceB實現類的例項?傳統的方法是在程式碼中建立 InterfaceB 實現類的例項,並將起賦予 clzB 。
而這樣一來, ClassA 在編譯期即依賴於 InterfaceB的實現。為了將呼叫者與實現者在編譯期分離,於是有了上面的程式碼.
我們根據預先在配置檔案中設定的實現類的類名 (Config.BImplementation) ,動態載入實現類,並通過InterfaceB 強制轉型後為 ClassA 所用。這就是介面注入的一個最原始的雛形。
而對於一個 Type1 型 IOC 容器而言,載入介面實現並建立其例項的工作由容器完成,見如下程式碼。

CODE:
public class ClassA {
private InterfaceB clzB;
public Object doSomething(InterfaceB b) {
clzB = b;
return clzB.doIt();
}
……
}
在執行期, InterfaceB 例項將由容器提供。
Type1 型 IOC 發展較早(有意或無意),在實際中得到了普遍應用,即使在 IOC的概念尚未確立時,這樣的方法也已經頻繁出現在我們的程式碼中。
下面的程式碼大家應該非常熟悉:

CODE:
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponseresponse)throws ServletException, IOException { …… } }
這也是一個 Type1 型注入, HttpServletRequest 和 HttpServletResponse 例項由Servlet Container 在執行期動態注入。
<2>Setter( 設值 ) 注入 (Type2)
各種型別的依賴注入模式中,設值注入模式在實際開發中得到了最廣泛的應用。

CODE:
public class ClassA {
private InterfaceB clzB;
public void setClzB(InterfaceB clzB) {
this. clzB = clzB; }
……
}
<3> 構造器注入 (Type3)
依賴關係是通過類建構函式建立的
容器通過呼叫類的構造方法將其所需的依賴關係注入其中

CODE:
public class DIByConstructor { private final DataSourcedataSource;
public DIByConstructor(DataSource ds) {
this.dataSource = ds;
}
……
}
<4> 三種依賴注入方式的比較
介面注入:
介面注入模式因為歷史較為悠久,在很多容器中都已經得到應用。但由於其在靈活性、易用性上不如其他兩種注入模式,因而在 IOC的專題世界內並不被看好。

Setter 注入:
對於習慣了傳統 javabean 開發的程式設計師,通過 setter 方法設定依賴關係更加直觀。
如果依賴關係較為複雜,那麼構造子注入模式的建構函式也會相當龐大,而此時設值注入模式則更為簡潔。
如果用到了第三方類庫,可能要求我們的元件提供一個預設的建構函式,此時構造子注入模式也不適用。

構造器注入:
在構造期間完成一個完整的、合法的物件。
所有依賴關係在建構函式中集中呈現。
依賴關係在構造時由容器一次性設定,元件被建立之後一直處於相對“不變”的穩定狀態。
只有元件的建立者關心其內部依賴關係,對呼叫者而言,該依賴關係處於“黑盒”之中。

總結:
可見, Type3 和 Type2 模式各有千秋,而 Spring 、 PicoContainer 都對 Type3 和 Type2型別的依賴注入機制提供了良好支援。這也就為我們提供了更多的選擇餘地。理論上,以 Type3 型別為主,輔之以 Type2型別機制作為補充,可以達到最好的依賴注入效果,不過對於基於 Spring Framework 開發的應用而言, Type2使用更加廣泛

相關推薦

Spring IOC注入方式介面注入setter注入構造注入

IOC ,全稱 (Inverse Of Control) ,中文意思為:控制反轉, Spring框架的核心基於控制反轉原理。 什麼是控制反轉? 控制反轉是一種將元件依賴關係的建立和管理置於程式外部的技術。 由容器控制程式之間的關係,而不是由程式碼直接控制 由於控制權由程式碼

servlet的介紹 & xml中配置 以及 & 實現方式補充設定瀏覽器不快取的方法

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:2小時 備註:幾乎每一句話都很有收穫,複習的時候務必要仔細一點 Servlet

Hive之——metastore配置方式

轉自:https://blog.csdn.net/l1028386804/article/details/51564235   Hive的meta資料支援以下三種儲存方式,其中兩種屬於本地儲存,一種為遠端儲存。遠端儲存比較適合生產環境。Hive官方wiki詳細介紹了這三種方式,連結

servlet的介紹 & xml中配置 以及 & 實現方式補充設定瀏覽器不快取的方法

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:3小時 動態資源: Servlet 簡單介紹:   Servlet

Python學習【第20篇】:互斥鎖以及程序之間的通訊方式IPC以及生產者個消費者模型 python併發程式設計之多程序1-----------互斥鎖與程序間的通訊

python併發程式設計之多程序1-----------互斥鎖與程序間的通訊 一、互斥鎖 程序之間資料隔離,但是共享一套檔案系統,因而可以通過檔案來實現程序直接的通訊,

斐波那契數列的實現方式遞迴迴圈矩陣

《劍指offer》裡講到了一種斐波那契數列的 O(logN) 時間複雜度的實現,覺得挺有意思的,三種方法都記錄一下。 一、遞迴     一般來說遞迴實現的程式碼都要比迴圈要簡潔,但是效率不高,比如遞迴計算斐波那契數列第n個元素。 long long Fibonacci

資料結構之頭結點連結串列的插入方式頭插法,尾插法,在pos處插入

建立頭結點 流程:首先建立頭結點表指標併為其分配空間——並將頭結點指向空,防止出現段錯誤。 程式碼: //建立頭結點 Node* Create_List () { //建立頭結點 Node* list = (Node*) malloc(

VMware虛擬機器聯網方式圖文詳細解說

VMware三種網路模式聯網 首先說一下VMware的幾個虛擬裝置 安裝了VMware虛擬機器後,會在網路連線對話方塊中多出兩個虛擬網絡卡,如圖: VMnet0:用於虛擬橋接網路下的虛擬交換機 VMnet1:用於虛擬Host-Only網路下的虛擬交換機 VMnet8:用於

LVS | LVS 的工作方式TUN原理

很多網路上的文章都為讀者介紹DR和TUN的工作方式類似,要麼就是直接講解DR模式和TUN模式的安裝配置方式,然後總結兩種模式類似。那為什麼有了DR模式後還需要TUN模式呢?為什麼ipvsadmin針對兩種模式的配置引數不一樣呢? 實際上LVS-DR模式和LVS

spring啟動方式

spring中的提供了一個名為org.springframework.web.util.IntrospectorCleanupListener的監聽器。它主要負責處理由 JavaBeans Introspector的使用而引起的緩衝洩露。spring中對它的描述如下: 它是一個在web應用關閉的時候,清除Ja

idea Spring-boot啟動方式

由於新建的Spring-Boot專案啟動會報 Whitelabel Error Page ,所以我新建一個Test類 url介面為 /hello ,GET請求方式 第一種啟動方式: 這個啟動方式相當於我們用的Main 啟動一樣 第二種啟動方式:

Java後臺框架篇--Spring配置方式

1、Explicit configuration in XML:顯示的XML配置。      優點:      1)XML配置方式進一步降低了耦合,使得應用更加容易擴充套件,即使對配置檔案進一步修改也不需要工程進行修改和重新編譯。      2)在處理大的業務量的時候,用X

JAVA處理Excel的實現方式

awm96 2012-05-15 13:49 createExcel(excel6); //modifyExcel(excel2); } static void readExcel(String filePath) throws Exception{ //HSSFWorkb

LVS | LVS 的工作方式DR原理

LVS的DR工作模式,是目前生產環境中最常用的一種工作模式,網上的資料也是最多的,有的文章對DR工作模式的講解還是比較透徹的。這裡我們通過圖文的方式再向您介紹一下DR的工作模式(同樣,如果看不清楚,請右鍵“檢視原圖”): 上圖反映了DR模式的整個工作過程,

Android Service Activity互動方式附原始碼

android SDK提供了Service,用於類似*nix守護程序或者windows的服務。 Service有兩種型別: 1.本地服務(Local Service):用於應用程式內部 2.遠端服務(Remote Sercie):用於android系統內部的應用程式之間 前

spring IOC機制

面試時被問到spring的三種注入方式,以前沒有接觸過,直接回答了說通過 註解和xml檔案,好尷尬,回來看看正確答案。 spring的三種注入方式為 介面注入,getter setter注入和構造器注入。 介面注入:在需要使用介面的地方直接注入一個介面的實現類。在ssm框架

Spark 2.x 叢集方式

Spark 2.x 可以通過以下3種方式配置和管理叢集1、獨立 - 包含在Spark中的簡單叢集管理器,可以輕鬆設定叢集。2、Apache Mesos  - 一個通用的叢集管理器,也可以執行Hadoop MapReduce和服務應用程式。3、Hadoop YARN  -  H

Spring-Boot -- RESTFUL風格的API介面呼叫方式【測試】

專案目錄結構圖: 說明:博主所有基於學習的內容全部基於上圖中的Spring-Boot框架,專案暫時不會上傳,因為還在完善,而且內容都比較離散,都是學習中遇到哪個知識點就往裡面加,因此,我只拆分

Spring依賴注入方式

平常的java開發中,程式設計師在某個類中需要依賴其它類的方法,則通常是new一個依賴類再呼叫類例項的方法,這種開發存在的問題是new的類例項不好統一管理,spring提出了依賴注入的思想,即依賴類不由程式設計師例項化,而是通過spring容器幫我們new指定例項並且將例項

Spring筆記之七Types of Injection Spring依賴注入實現型別

本文研究Spring的三種依賴注入實現型別——介面注入(Interface Injection)、設值注入(Setter Injection)、構造子注入(Constructor Injection)。 Type1 介面注入: 傳統的建立介面物件的方法, 藉助介面來將呼叫者與