亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3235 | 回復(fù): 0
打印 上一主題 下一主題

控制反轉(zhuǎn)(IoC)與依賴注入(DI) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-01-13 11:39 |只看該作者 |倒序?yàn)g覽
 
本文示例源代碼或素材下載
  1.控制反轉(zhuǎn)(Inversion of Control)與依賴注入(Dependency Injection)
  控制反轉(zhuǎn)即IoC (Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器,通過容器來實(shí)現(xiàn)對(duì)象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對(duì)組件對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。
  IoC是一個(gè)很大的概念,可以用不同的方式來實(shí)現(xiàn)。其主要實(shí)現(xiàn)方式有兩種:依賴查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和Apache Avalon都使用這種方式。依賴注入(Dependency Injection):組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關(guān)系。后者是時(shí)下最流行的IoC類型,其又有接口注入(Interface Injection),設(shè)值注入(Setter Injection)和構(gòu)造子注入(Constructor Injection)三種方式。

  圖1 控制反轉(zhuǎn)概念結(jié)構(gòu)
  依賴注入之所以更流行是因?yàn)樗且环N更可取的方式:讓容器全權(quán)負(fù)責(zé)依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶參數(shù)的構(gòu)造子或者接口,使容器可以在初始化時(shí)組裝對(duì)象的依賴關(guān)系。其與依賴查找方式相比,主要優(yōu)勢(shì)為:查找定位操作與應(yīng)用代碼完全無關(guān)。不依賴于容器的API,可以很容易地在任何容器以外使用應(yīng)用對(duì)象。不需要特殊的接口,絕大多數(shù)對(duì)象可以做到完全不必依賴容器。
  2.好萊塢原則
  IoC體現(xiàn)了好萊塢原則,即“不要打電話過來,我們會(huì)打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時(shí)候,模板方法模式的核心是,基類(抽象類)定義了算法的骨架,而將一些步驟延遲到子類中。

  圖2 模板方法模式類圖
  現(xiàn)在來考慮IoC的實(shí)現(xiàn)機(jī)制,組件定義了整個(gè)流程框架,而其中的一些業(yè)務(wù)邏輯的實(shí)現(xiàn)要借助于其他業(yè)務(wù)對(duì)象的加入,它們可以通過兩種方式參與到業(yè)務(wù)流程中,一種是依賴查找(Dependency Lookup),類似與JDNI的實(shí)現(xiàn),通過JNDI來找到相應(yīng)的業(yè)務(wù)對(duì)象(代碼1),另一種是依賴注入,通過IoC容器將業(yè)務(wù)對(duì)象注入到組件中。
  3. 依賴查找(Dependency Lookup)
  下面代碼展示了基于JNDI實(shí)現(xiàn)的依賴查找機(jī)制。
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)代碼實(shí)現(xiàn)
  依賴查找的主要問題是,這段代碼必須依賴于JNDI環(huán)境,所以它不能在應(yīng)用服務(wù)器之外運(yùn)行,并且如果要用別的方式取代JNDI來查找資源和協(xié)作對(duì)象,就必須把JNDI代碼抽出來重構(gòu)到一個(gè)策略方法中去。
  4. 依賴注入(Dependency Injection)
  依賴注入的基本原則是:應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴的協(xié)作對(duì)象。配置對(duì)象的工作應(yīng)該由IoC容器負(fù)責(zé),“查找資源”的邏輯應(yīng)該從應(yīng)用組件的代碼中抽取出來,交給IoC容器負(fù)責(zé)。
下面分別演示3中注入機(jī)制。
  代碼2 待注入的業(yè)務(wù)對(duì)象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類展示了一個(gè)業(yè)務(wù)組件,它的實(shí)現(xiàn)需要對(duì)象Content的注入。代碼3,代碼4,代碼5,6分別演示構(gòu)造子注入(Constructor Injection),設(shè)值注入(Setter Injection)和接口注入(Interface Injection)三種方式。
  代碼3構(gòu)造子注入(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設(shè)值注入(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 設(shè)置注入接口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中得到廣泛應(yīng)用。
  代碼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容器的配置可以通過一個(gè)xml文件完成。
  使用這種方式對(duì)對(duì)象進(jìn)行集中管理,使用依賴拖拽與依賴查找本質(zhì)的區(qū)別是,依賴查找是在業(yè)務(wù)組件代碼中進(jìn)行的,而不是從一個(gè)集中的注冊(cè)處,特定的地點(diǎn)執(zhí)行。
  本文出自 “子 孑” 博客,請(qǐng)務(wù)必保留此出處
http://zhangjunhd.blog.51cto.com/113473/126530


本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/884/showart_2147365.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP