日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

IOC控制反转浅析

發(fā)布時(shí)間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOC控制反转浅析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.控制反轉(zhuǎn)(Inversion of Control)與依賴(lài)注入(Dependency Injection)

?????????控制反轉(zhuǎn)即IoC (Inversion of Control),它把傳統(tǒng)上由程序代碼直接操控的對(duì)象的調(diào)用權(quán)交給容器,通過(guò)容器來(lái)實(shí)現(xiàn)對(duì)象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對(duì)組件對(duì)象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。

?????????IoC是一個(gè)很大的概念,可以用不同的方式來(lái)實(shí)現(xiàn)。其主要實(shí)現(xiàn)方式有兩種:<1>依賴(lài)查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。EJB和Apache Avalon都使用這種方式。<2>依賴(lài)注入(Dependency Injection):組件不做定位查詢(xún),只提供普通的Java方法讓容器去決定依賴(lài)關(guān)系。后者是時(shí)下最流行的IoC類(lèi)型,其又有接口注入(Interface Injection),設(shè)值注入(Setter Injection)和構(gòu)造子注入(Constructor Injection)三種方式。


?????????????????????????????????????????????

?????????????????????????????????????????????????????????????????????????????????圖1 控制反轉(zhuǎn)概念結(jié)構(gòu)


????????依賴(lài)注入之所以更流行是因?yàn)樗且环N更可取的方式:讓容器全權(quán)負(fù)責(zé)依賴(lài)查詢(xún),受管組件只需要暴露JavaBean的setter方法或者帶參數(shù)的構(gòu)造子或者接口,使容器可以在初始化時(shí)組裝對(duì)象的依賴(lài)關(guān)系。其與依賴(lài)查找方式相比,主要優(yōu)勢(shì)為:<1>查找定位操作與應(yīng)用代碼完全無(wú)關(guān)。<2>不依賴(lài)于容器的API,可以很容易地在任何容器以外使用應(yīng)用對(duì)象。<3>不需要特殊的接口,絕大多數(shù)對(duì)象可以做到完全不必依賴(lài)容器。



2.好萊塢原則
????????IoC體現(xiàn)了好萊塢原則,即“不要打電話過(guò)來(lái),我們會(huì)打給你”。第一次遇到好萊塢原則是在了解模板方法(Template Mathod)模式的時(shí)候,模板方法模式的核心是,基類(lèi)(抽象類(lèi))定義了算法的骨架,而將一些步驟延遲到子類(lèi)中。


??????????????????????????????????
?????????????????????????????????????????????????????????????圖2 模板方法模式類(lèi)圖

????????現(xiàn)在來(lái)考慮IoC的實(shí)現(xiàn)機(jī)制,組件定義了整個(gè)流程框架,而其中的一些業(yè)務(wù)邏輯的實(shí)現(xiàn)要借助于其他業(yè)務(wù)對(duì)象的加入,它們可以通過(guò)兩種方式參與到業(yè)務(wù)流程中,一種是依賴(lài)查找(Dependency Lookup),類(lèi)似與JDNI的實(shí)現(xiàn),通過(guò)JNDI來(lái)找到相應(yīng)的業(yè)務(wù)對(duì)象(代碼1),另一種是依賴(lài)注入,通過(guò)IoC容器將業(yè)務(wù)對(duì)象注入到組件中。



3. 依賴(lài)查找(Dependency Lookup)
下面代碼展示了基于JNDI實(shí)現(xiàn)的依賴(lài)查找機(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”);}……

依賴(lài)查找的主要問(wèn)題是,這段代碼必須依賴(lài)于JNDI環(huán)境,所以它不能在應(yīng)用服務(wù)器之外運(yùn)行,并且如果要用別的方式取代JNDI來(lái)查找資源和協(xié)作對(duì)象,就必須把JNDI代碼抽出來(lái)重構(gòu)到一個(gè)策略方法中去。


4.依賴(lài)注入(Dependency Injection)
依賴(lài)注入的基本原則是:應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴(lài)的協(xié)作對(duì)象。配置對(duì)象的工作應(yīng)該由IoC容器負(fù)責(zé),“查找資源”的邏輯應(yīng)該從應(yīng)用組件的代碼中抽取出來(lái),交給IoC容器負(fù)責(zé)。

下面分別演示3中注入機(jī)制。
待注入的業(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類(lèi)展示了一個(gè)業(yè)務(wù)組件,它的實(shí)現(xiàn)需要對(duì)象Content的注入。

  • 構(gòu)造子注入
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();} }


  • 設(shè)值注入
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();} }


  • 接口注入
package com.zj.ioc.di.iface; import com.zj.ioc.di.Content;public interface InContent {void createContent(Content content); }片 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.依賴(lài)拖拽(Dependency Pull)
最后需要介紹的是依賴(lài)拖拽,注入的對(duì)象如何與組件發(fā)生聯(lián)系,這個(gè)過(guò)程就是通過(guò)依賴(lài)拖拽實(shí)現(xiàn)。
代碼7 依賴(lài)拖拽示例

public static void main(String[] args) throws Exception{ //get the bean factory BeanFactory factory = getBeanFactory(); MessageRender mr = (MessageRender) factory.getBean(“renderer”); mr.render(); }

而通常對(duì)注入對(duì)象的配置可以通過(guò)一個(gè)xml文件完成。
使用這種方式對(duì)對(duì)象進(jìn)行集中管理,使用依賴(lài)拖拽與依賴(lài)查找本質(zhì)的區(qū)別是,依賴(lài)查找是在業(yè)務(wù)組件代碼中進(jìn)行的,而不是從一個(gè)集中的注冊(cè)處,特定的地點(diǎn)執(zhí)行。



文章來(lái)自:http://zhangjunhd.blog.51cto.com/113473/126530/

wiki解釋

總結(jié)

以上是生活随笔為你收集整理的IOC控制反转浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。