Spring IOC三種注入方式比較
Spring IOC三種注入方式:
1. 介面注入
2. getter,setter方式注入
3. 構造器注入
物件與物件之間的關係可以簡單的理解為物件之間的依賴關係:
A類需要B類的一個例項來進行某些操作,比如在A類的方法中需要呼叫B類的方法來完成功能,叫做A類依賴於B類.
控制反轉是一種將元件依賴關係的建立和管理置於程式外部的技術,由容器控制程式之間的關係,而不是由程式碼直接控制.
1.介面注入
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所用,這就是介面注入的一個最原始的雛形.
public class ClassA {
private InterfaceB clzB;
public Object doSomething(InterfaceB b) {
clzB = b;
return clzB.doIt();
}
……
}
上面程式碼中,載入介面實現並建立其例項的工作由容器完成.
在執行期,InterfaceB例項將由容器提供.即使在IOC的概念尚未確立時,這樣的方法也已經頻繁出現在我們的程式碼中.
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
……
}
}
HttpServletRequest和HttpServletResponse例項由Servlet Container在執行期動態注入.
2.Setter設定注入
基於設定模式的依賴注入機制更加直觀,也更加自然.
public class ClassA {
private InterfaceB clzB;
public void setClzB(InterfaceB clzB) {
this.clzB = clzB;
}
……
}
3.構造器注入
public class DIByConstructor {
private final DataSource dataSource;
public DIByConstructor(DataSource ds) {
this.dataSource = ds;
}
……
}
構造器注入,即透過建構函式完成依賴關係的設定,容器透過呼叫類的構造方法將其所需的依賴關係注入其中.
三種注入方式比較:
介面注入:
介面注入模式因為具備侵入性,它要求元件必須與特定的介面相關聯,因此並不被看好,實際使用有限。
Setter 注入:
對於習慣了傳統 javabean 開發的程式設計師,透過 setter 方法設定依賴關係更加直觀。
如果依賴關係較為複雜,那麼構造子注入模式的建構函式也會相當龐大,而此時設值注入模式則更為簡潔。
如果用到了第三方類庫,可能要求我們的元件提供一個預設的建構函式,此時構造子注入模式也不適用。
構造器注入:
在構造期間完成一個完整的、合法的物件。
所有依賴關係在建構函式中集中呈現。
依賴關係在構造時由容器一次性設定,元件被建立之後一直處於相對“不變”的穩定狀態。
只有元件的建立者關心其內部依賴關係,對呼叫者而言,該依賴關係處於“黑盒”之中。
總結
Spring使用注入方式,為什麼使用注入方式,這系列問題實際歸結起來就是一句話,Spring的注入和IoC(本人關於IoC的闡述)反轉控制是一回事。
理論上:第三種注入方式(建構函式注入)在符合java使用原則上更加合理,第二種注入方式(setter注入)作為補充。
實際上:我個人認為第二種注入方式(setter注入)可以取得更加直觀的效果,在使用工作上有不可比擬的優勢,所以setter注入依賴關係應用更加廣泛。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1611062/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring學習日記01_IOC_xml的三種注入方式SpringXML
- Spring的三種依賴注入的方式Spring依賴注入
- spring常用的三種依賴注入方式Spring依賴注入
- Spring注入Bean的幾種方式SpringBean
- Spring IOC——依賴注入Spring依賴注入
- Spring中bean的四種注入方式SpringBean
- 轉換String三種方式比較:toString()、String.valueOf()、(String)
- spring原始碼解析之IOC容器(三)——依賴注入Spring原始碼依賴注入
- .NetCore中三種注入方式的思考NetCore
- Spring基礎之 IOC九種bean宣告方式SpringBean
- 【Java面試】Spring中有哪些方式可以把Bean注入到IOC容器?Java面試SpringBean
- Spring實現IOC容器的兩種實現方式Spring
- JS嵌入html的方式及各種方式的比較JSHTML
- Spring-注入方式Spring
- mongodb資料遷移2種方式比較MongoDB
- IocPerformance 常見IOC 功能、效能比較ORM
- 4、Spring IOC容器 Bean物件例項化的3種方式SpringBean物件
- Spring Boot中@Import三種使用方式!Spring BootImport
- 三種高階比較排序演算法排序演算法
- 三種滑動方式的比較(scrollTo & view動畫 & 改變佈局引數)View動畫
- jmeter混合場景的多種實現方式比較JMeter
- spring 詳細講解(ioc,依賴注入,aop)Spring依賴注入
- Spring6框架中依賴注入的多種方式(推薦構造器注入)Spring框架依賴注入
- 頂級三種服務網格比較 - cncf
- Spring的依賴注入的方式Spring依賴注入
- spring原始碼解析之IOC容器(四)——屬性注入Spring原始碼
- 一文徹底弄懂Spring IOC 依賴注入Spring依賴注入
- 比較Java Swing中三種註冊事件的方法Java事件
- Spring Boot與Micronaut比較Spring Boot
- Spring注入Bean的四種方式,看這一篇就夠了SpringBean
- Java字串建立方式比較Java字串
- 幾種排序的比較排序
- Spring升級案例之IOC介紹和依賴注入Spring依賴注入
- 理解Spring中依賴注入(DI)與控制反轉(IoC)Spring依賴注入
- Spring Boot 讀取配置內容的三種方式Spring Boot
- 【前端詞典】4 種滾動吸頂實現方式的比較前端
- Java中陣列判斷元素存在幾種方式比較詳解Java陣列
- Spring Boot與Eclipse MicroProfile比較Spring BootEclipse
- Spring系列:基於XML的方式構建IOCSpringXML