控制反轉與依賴注入(IOC和DI)
1.控制反轉(Inversion of Control)與依賴注入(Dependency Injection)
控制反轉即IoC (Inversion of Control),它把傳統上由程式程式碼直接操控的物件的呼叫權交給容器,通過容器來實現物件元件的裝配和管理。所謂的“控制反轉”概念就是對元件物件控制權的轉移,從程式程式碼本身轉移到了外部容器。
IoC是一個很大的概念,可以用不同的方式來實現。其主要實現方式有兩種:<1>依賴查詢(Dependency Lookup):容器提供回撥介面和上下文環境給元件。EJB和Apache Avalon都使用這種方式。<2>依賴注入(Dependency Injection):元件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關係。後者是時下最流行的IoC型別,其又有介面注入(Interface
Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。
圖1 控制反轉概念結構
依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管元件只需要暴露JavaBean的setter方法或者帶引數的構造子或者介面,使容器可以在初始化時組裝物件的依賴關係。其與依賴查詢方式相比,主要優勢為:<1>查詢定位操作與應用程式碼完全無關。<2>不依賴於容器的API,可以很容易地在任何容器以外使用應用物件。<3>不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器。
2.好萊塢原則
IoC體現了好萊塢原則,即“不要打電話過來,我們會打給你”。第一次遇到好萊塢原則是在瞭解模板方法(Template Mathod)模式的時候,模板方法模式的核心是,基類(抽象類)定義了演算法的骨架,而將一些步驟延遲到子類中。
圖2 模板方法模式類圖
現在來考慮IoC的實現機制,元件定義了整個流程框架,而其中的一些業務邏輯的實現要藉助於其他業務物件的加入,它們可以通過兩種方式參與到業務流程中,一種是依賴查詢(Dependency Lookup),類似與JDNI的實現,通過JNDI來找到相應的業務物件(程式碼1),另一種是依賴注入,通過IoC容器將業務物件注入到元件中。
3. 依賴查詢(Dependency Lookup)
下面程式碼展示了基於JNDI實現的依賴查詢機制。
public class MyBusniessObject{
private DataSource ds;
private MyCollaborator myCollaborator;
public MyBusnissObject(){
Context ctx = null;
try{
ctx = new InitialContext();
ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);
myCollaborator =
(MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);
}……
|
程式碼1依賴查詢(Dependency Lookup)程式碼實現
依賴查詢的主要問題是,這段程式碼必須依賴於JNDI環境,所以它不能在應用伺服器之外執行,並且如果要用別的方式取代JNDI來查詢資源和協作物件,就必須把JNDI程式碼抽出來重構到一個策略方法中去。
4. 依賴注入(Dependency Injection)
依賴注入的基本原則是:應用元件不應該負責查詢資源或者其他依賴的協作物件。配置物件的工作應該由IoC容器負責,“查詢資源”的邏輯應該從應用元件的程式碼中抽取出來,交給IoC容器負責。
下面分別演示3中注入機制。
程式碼2 待注入的業務物件Content.java
package com.zj.ioc.di;
public class Content {
public void BusniessContent(){
System.out.println("do business");
}
public void AnotherBusniessContent(){
System.out.println("do another business");
}
}
|
MyBusniess類展示了一個業務元件,它的實現需要物件Content的注入。程式碼3,程式碼4,程式碼5,6分別演示構造子注入(Constructor Injection),設值注入(Setter Injection)和介面注入(Interface Injection)三種方式。
程式碼3構造子注入(Constructor Injection)MyBusiness.java
package com.zj.ioc.di.ctor;
import com.zj.ioc.di.Content;
public class MyBusiness {
private Content myContent;
public MyBusiness(Content content) {
myContent = content;
}
public void doBusiness(){
myContent.BusniessContent();
}
public void doAnotherBusiness(){
myContent.AnotherBusniessContent();
}
}
|
程式碼4設值注入(Setter Injection) MyBusiness.java
package com.zj.ioc.di.set;
import com.zj.ioc.di.Content;
public class MyBusiness {
private Content myContent;
public void setContent(Content
content) {
myContent = content;
}
public void doBusiness(){
myContent.BusniessContent();
}
public void doAnotherBusiness(){
myContent.AnotherBusniessContent();
}
}
|
程式碼5 設定注入介面InContent.java
package com.zj.ioc.di.iface;
import com.zj.ioc.di.Content;
public interface InContent {
void createContent(Content content);
}
|
程式碼6介面注入(Interface Injection)MyBusiness.java
package com.zj.ioc.di.iface;
import com.zj.ioc.di.Content;
public class MyBusiness implements InContent{
private Content myContent;
public void createContent(Content
content) {
myContent = content;
}
public void doBusniess(){
myContent.BusniessContent();
}
public void doAnotherBusniess(){
myContent.AnotherBusniessContent();
}
}
|
5.依賴拖拽(Dependency Pull)
最後需要介紹的是依賴拖拽,注入的物件如何與元件發生聯絡,這個過程就是通過依賴拖拽實現。
程式碼7 依賴拖拽示例
public static void main(String[] args) throws Exception{
//get the bean factory
BeanFactory factory = getBeanFactory();
MessageRender mr = (MessageRender) factory.getBean(“renderer”);
mr.render();
}
|
而通常對注入物件的配置可以通過一個xml檔案完成。
使用這種方式對物件進行集中管理,使用依賴拖拽與依賴查詢本質的區別是,依賴查詢是在業務元件程式碼中進行的,而不是從一個集中的註冊處,特定的地點執行。
相關文章
- 控制反轉(IoC)與依賴注入(DI)依賴注入
- Java:控制反轉(IoC)與依賴注入(DI)Java依賴注入
- PHP 控制反轉(IoC) 和 依賴注入(DI)PHP依賴注入
- PHP 控制反轉(IOC)和依賴注入(DI)PHP依賴注入
- .NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)模式依賴注入
- 解構控制反轉(IoC)和依賴注入(DI)依賴注入
- 8.(轉)控制反轉(IoC)與依賴注入(DI)依賴注入
- 深入理解控制反轉(IoC)和依賴注入(DI)依賴注入
- php實現依賴注入(DI)和控制反轉(IOC)PHP依賴注入
- 深入理解IoC(控制反轉)、DI(依賴注入)依賴注入
- 理解Spring中依賴注入(DI)與控制反轉(IoC)Spring依賴注入
- Spring框架之IOC/DI(控制反轉/依賴注入)Spring框架依賴注入
- 控制反轉(IOC)與依賴注入(DI)模式解析及實踐依賴注入模式
- OOD、DIP、IOC、DI、依賴注入容器(即 控制反轉容器,IOC Container)依賴注入AI
- 深入理解spring容器中的控制反轉(IOC)和依賴注入(DI)Spring依賴注入
- 深入探討控制反轉(IOC)與依賴注入(DI)模式原理與應用實踐依賴注入模式
- 淺析依賴倒轉、控制反轉、IoC 容器、依賴注入。依賴注入
- 依賴注入和控制反轉依賴注入
- Spring系列第二講 控制反轉(IoC)與依賴注入(DI),晦澀難懂麼?Spring依賴注入
- Spring4學習(一)IoC控制反轉也稱為DI依賴注入Spring依賴注入
- Spring 控制反轉和依賴注入Spring依賴注入
- 什麼是控制反轉(IOC)?什麼是依賴注入?依賴注入
- 你確定懂?徹底搞懂 控制反轉(IoC Inversion of Control )與依賴注入(DI Dependency Inversion Principle )依賴注入
- 依賴倒置(DIP)與依賴注入(DI)依賴注入
- java 控制反轉和依賴注入的理解Java依賴注入
- CommunityToolkit.Mvvm8.1 IOC依賴注入控制反轉(5)UnityMVVM依賴注入
- 前端理解依賴注入(控制反轉)前端依賴注入
- IOC容器和依賴注入依賴注入
- 依賴倒置、依賴注入和控制反轉傻傻分不清楚?依賴注入
- 【Spring】Spring依賴注入與控制反轉理解Spring依賴注入
- 對控制反轉和依賴注入的突然頓悟依賴注入
- 軟體工程入門-輕鬆理解依賴注入 (DI) 和 IoC 容器軟體工程依賴注入
- Spring理論基礎-控制反轉和依賴注入Spring依賴注入
- spring中的控制反轉和依賴注入 --講解Spring依賴注入
- 控制反轉,依賴注入,依賴倒置傻傻分不清楚?依賴注入
- 寫一個簡單的IoC容器案例,理解什麼是依賴注入和控制反轉依賴注入
- Spring 依賴注入 DISpring依賴注入
- PHP DIY 系列------框架篇:8. 依賴注入和控制反轉PHP框架依賴注入