隨筆-42  評(píng)論-349  文章-4  trackbacks-0
          ?

          我的書(shū)中的一段,貼出來(lái)。呵呵。大伙兒拍磚哦!by:張勇


          ? IoC即Inversion of Control,控制反轉(zhuǎn)。它不是一種編程技術(shù),而是一種設(shè)計(jì)模式。利用它,可以促進(jìn)應(yīng)用程序組件或類(lèi)之間的松散耦合。一般的情況下,我們需要自己創(chuàng)建對(duì)象的實(shí)例,比如在Computer類(lèi)中創(chuàng)建一個(gè)打印機(jī)的實(shí)例:

          1Printer?printer?=?new?DellPrinter();//創(chuàng)建一個(gè)戴爾打印機(jī)的實(shí)例

          如果使用IoC,我們則不必再自己創(chuàng)建類(lèi)的實(shí)例,而是將創(chuàng)建對(duì)象的任務(wù)交給IoC容器去做。這樣,我們?cè)谑褂媚硞€(gè)對(duì)象的時(shí)候,就可以直接從容器中獲取一個(gè)實(shí)例。就像一個(gè)好萊塢的原則一樣“Don't call me.I'll call you!”,容器會(huì)在合適的時(shí)候創(chuàng)建它。我們就像不必考慮對(duì)象的銷(xiāo)毀一樣,也可以不必考慮對(duì)象的創(chuàng)建,這就是控制反轉(zhuǎn)。
          ??? 這樣做有什么好處呢?在上面的例子中,我們創(chuàng)建為我們的電腦安裝了一個(gè)戴爾打印機(jī)(創(chuàng)建一個(gè)戴爾打印機(jī)類(lèi)的實(shí)例)。可是如果有一天,我們系統(tǒng)要升級(jí)了,需要使用惠普的打印機(jī)。這時(shí),由于我們把打印機(jī)已經(jīng)“固化”到電腦中了(打印機(jī)和電腦的耦合很高),要更換打印機(jī),就不得不先拆開(kāi)電腦,從主板中卸下打印機(jī),再安裝新的打印機(jī)(修改Computer類(lèi)的源代碼,然后重新編譯,重新部署)。可以看到,這是一個(gè)計(jì)算機(jī)專(zhuān)家才能完成的任務(wù),對(duì)于一個(gè)對(duì)計(jì)算機(jī)不是很了解的人來(lái)說(shuō),這將會(huì)是一場(chǎng)噩夢(mèng)。那么如何解決這個(gè)問(wèn)題呢?辦法之一就是我們把打印機(jī)抽象成一個(gè)接口:

          ?

          1 public ? interface ?Printer? {
          2 ???? public ?? void ?print();
          3 }

          這樣各個(gè)廠商在生產(chǎn)打印機(jī)的時(shí)候,就只是需要實(shí)現(xiàn)這個(gè)接口所定義的功能就行了。就像我們?cè)陔娔X上做一個(gè)專(zhuān)門(mén)的打印機(jī)模塊,需要的時(shí)候卸掉原來(lái)的模塊,再安裝上新型號(hào)就的打印機(jī)可以了,前提是新的模塊必須和以前的有一樣的功能和調(diào)用接口。在電腦中變成了這樣:

          ?

          ?

          1 Printer?printer?; // 提供一個(gè)打印機(jī)的接口
          2 // 提供一個(gè)安裝打印機(jī)的方法
          3 public ? void ?setPrinter(Printer?printer)? {
          4 ???????? this .printer? = ?printer;
          5 ????}

          6

          ?這樣看似很好的解決了上述問(wèn)題。但是實(shí)際上電腦(Computer)和打印機(jī)(Printer)之間的耦合性仍然很高:打印機(jī)的代碼寫(xiě)入了電腦中,我們不得不在使用之前先調(diào)SetPrinter方法為電腦“安裝”打印機(jī),但是電腦使用者僅僅想使用打印機(jī)而已,可是這里他卻不得不做安裝打印機(jī)的工作。

          這種依賴(lài)關(guān)系在“分離關(guān)注”的思想下是無(wú)法忍耐的,于是產(chǎn)生了新的模式,即控制反轉(zhuǎn)( IoC )。使用這種方式,電腦 (Computer) 只是需要提供一個(gè)打印機(jī) (Printer) 的“屬性”和安裝打印機(jī)的“渠道”。如果需要(當(dāng)需要使用打印任務(wù)時(shí)), IoC 容器會(huì)在合適的時(shí)候自動(dòng)為電腦注入(安裝)打印機(jī)。這就好像我們請(qǐng)了個(gè)網(wǎng)管,我們要使用打印機(jī)的時(shí)候,可以直接告訴網(wǎng)管“我需要一個(gè)惠普打印機(jī) ”,然后網(wǎng)管就自動(dòng)的找到打印機(jī)并安裝好,我們就可以使用它了。這樣電腦使用者就可以完全不必關(guān)心打印機(jī)而只需使用它就行了。代碼如下:

          ?1 public ? class ?Computer? {
          ?2 ???? private ?Printer?printer;
          ?3 ???? public ?Print() {
          ?4 ????????printer.print();
          ?5 ????}

          ?6 ???? public ?Printer?getPrinter()? {
          ?7 ???????? return ?printer;
          ?8 ????}

          ?9 ???? public ? void ?setPrinter(Printer?printer)? {
          10 ???????? this .printer? = ?printer;
          11 ????}

          12 }

          ??

          1 ???? < bean? id ="Computer" ?class ="com.Computer" >
          2 ?????? < property? name ="printer" ?ref ="Printer" />
          3 ???? </ bean >
          4


          ???Spring?框架為我們提供了一個(gè)優(yōu)秀的IoC容器。我們只是需要在它的配置文件中指明我們需要那個(gè)類(lèi)的實(shí)例,這個(gè)類(lèi)在那里,Spring的IoC容器會(huì)在合適的時(shí)候自動(dòng)的為我們注入這個(gè)類(lèi)的實(shí)例。從而我們可以完全不必考慮對(duì)象的創(chuàng)建工作,還可以實(shí)現(xiàn)應(yīng)用程序各個(gè)組件的“即插即用”,而不需要修改源代碼。

          ?? Spring提供呢多種配置文件的形式,但是推薦使用xml配置文件來(lái)驅(qū)動(dòng)應(yīng)用,盡管它也支持.properties文件和數(shù)據(jù)庫(kù)的配置形式。



          By:殘夢(mèng)追月
          posted on 2008-07-15 15:07 殘夢(mèng)追月 閱讀(3736) 評(píng)論(11)  編輯  收藏 所屬分類(lèi): Spring

          評(píng)論:
          # re: 關(guān)于IoC的介紹 2008-07-16 09:59 | 殘夢(mèng)追月
          大俠不要客氣,拍磚啊。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2008-07-17 21:26 | 殘夢(mèng)追月
          今天突然發(fā)現(xiàn)好大一個(gè)錯(cuò)誤!汗!瀑布汗!我狂汗!馬上改正!達(dá)人莫怪啊。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 [未登錄](méi) 2008-07-29 04:40 | zhang
          < bean id ="Computer" class ="com.Computer" >
          為什么不是class ="Computer" ,id ="Computer01" ?  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2008-07-29 14:10 | 殘夢(mèng)追月
          @zhang
          因?yàn)樵谖业墓こ讨蠧omputer類(lèi)在com包中啊,這里必須要它的全類(lèi)路徑。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 [未登錄](méi) 2008-08-03 21:27 | moonandsun
          不錯(cuò),繼續(xù)努力。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2008-08-03 21:56 | 殘夢(mèng)追月
          @moonandsun
          thanks。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2008-08-26 09:41 | ctl
          例子很好,我終于明白了  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2008-11-03 13:59 | volvo
          謝謝,太棒了!!!  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2010-11-25 12:30 | 劉振威
          這個(gè)感覺(jué)像是struts2中的params截?cái)r器自動(dòng)從表單轉(zhuǎn)移數(shù)據(jù)到bean屬性中?
          是不是這樣..我沒(méi)學(xué)過(guò)spring.呵呵  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 2011-01-02 22:48 | 過(guò)客·
          恩 懂了IOC 不過(guò)其實(shí)你關(guān)鍵是要寫(xiě)的是XML的介紹 這個(gè)才是核心 不過(guò)寫(xiě)的還是很清楚了 學(xué)習(xí)啊 有空加我QQ 教教我咯 ·····  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于IoC的介紹 [未登錄](méi) 2013-02-18 09:38 | 111
          @過(guò)客&#183;
          不錯(cuò),支持下  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 积石山| 静乐县| 富宁县| 武威市| 建阳市| 张家港市| 留坝县| 丰原市| 宝鸡市| 香格里拉县| 南川市| 罗源县| 康平县| 炉霍县| 郧西县| 建德市| 保山市| 连云港市| 静乐县| 郸城县| 马公市| 农安县| 黄陵县| 七台河市| 淳化县| 霍城县| 当阳市| 西林县| 荔浦县| 和静县| 西吉县| 体育| 海淀区| 图木舒克市| 左贡县| 贺州市| 周口市| 彭泽县| 沛县| 基隆市| 红河县|