亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
控制反轉(IoC)與依賴注入(DI)
[打印本頁]
作者:
軒轅砍刀
時間:
2010-01-13 11:39
標題:
控制反轉(IoC)與依賴注入(DI)
本文示例源代碼或素材下載
1.控制反轉(Inversion of Control)與依賴注入(Dependency Injection)
控制反轉即IoC (Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權交給容器,通過容器來實現(xiàn)對象組件的裝配和管理。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。
IoC是一個很大的概念,可以用不同的方式來實現(xiàn)。其主要實現(xiàn)方式有兩種:依賴查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和Apache Avalon都使用這種方式。依賴注入(Dependency Injection):組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關系。后者是時下最流行的IoC類型,其又有接口注入(Interface Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。
圖1 控制反轉概念結構
依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數(shù)的構造子或者接口,使容器可以在初始化時組裝對象的依賴關系。其與依賴查找方式相比,主要優(yōu)勢為:查找定位操作與應用代碼完全無關。不依賴于容器的API,可以很容易地在任何容器以外使用應用對象。不需要特殊的接口,絕大多數(shù)對象可以做到完全不必依賴容器。
2.好萊塢原則
IoC體現(xiàn)了好萊塢原則,即“不要打電話過來,我們會打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時候,模板方法模式的核心是,基類(抽象類)定義了算法的骨架,而將一些步驟延遲到子類中。
圖2 模板方法模式類圖
現(xiàn)在來考慮IoC的實現(xiàn)機制,組件定義了整個流程框架,而其中的一些業(yè)務邏輯的實現(xiàn)要借助于其他業(yè)務對象的加入,它們可以通過兩種方式參與到業(yè)務流程中,一種是依賴查找(Dependency Lookup),類似與JDNI的實現(xiàn),通過JNDI來找到相應的業(yè)務對象(代碼1),另一種是依賴注入,通過IoC容器將業(yè)務對象注入到組件中。
3. 依賴查找(Dependency Lookup)
下面代碼展示了基于JNDI實現(xiàn)的依賴查找機制。
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)代碼實現(xiàn)
依賴查找的主要問題是,這段代碼必須依賴于JNDI環(huán)境,所以它不能在應用服務器之外運行,并且如果要用別的方式取代JNDI來查找資源和協(xié)作對象,就必須把JNDI代碼抽出來重構到一個策略方法中去。
4. 依賴注入(Dependency Injection)
依賴注入的基本原則是:應用組件不應該負責查找資源或者其他依賴的協(xié)作對象。配置對象的工作應該由IoC容器負責,“查找資源”的邏輯應該從應用組件的代碼中抽取出來,交給IoC容器負責。
下面分別演示3中注入機制。
代碼2 待注入的業(yè)務對象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類展示了一個業(yè)務組件,它的實現(xiàn)需要對象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)
最后需要介紹的是依賴拖拽,它在Spring中得到廣泛應用。
代碼7 依賴拖拽示例
public static void main(String[] args) throws Exception{
//get the bean factory
BeanFactory factory = getBeanFactory();
MessageRender mr = (MessageRender) factory.getBean(“renderer”);
mr.render();
}
而通常IoC容器的配置可以通過一個xml文件完成。
使用這種方式對對象進行集中管理,使用依賴拖拽與依賴查找本質的區(qū)別是,依賴查找是在業(yè)務組件代碼中進行的,而不是從一個集中的注冊處,特定的地點執(zhí)行。
本文出自 “子 孑” 博客,請務必保留此出處
http://zhangjunhd.blog.51cto.com/113473/126530
本文來自ChinaUnix博客,如果查看原文請點:
http://blog.chinaunix.net/u/884/showart_2147365.html
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2