少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          Spring控制反轉(zhuǎn)(IoC)的理解

          Spring框架的核心就是控制反轉(zhuǎn)(Inversion of Control)和依賴注入(Dependency Injection),通過(guò)這兩方面來(lái)實(shí)現(xiàn)松耦合。

          使用IoC,對(duì)象是被動(dòng)的接受依賴類,而不是自己主動(dòng)的去找。容器在實(shí)例化的時(shí)候主動(dòng)將它的依賴類注入給它。可以這樣理解:控制反轉(zhuǎn)將類的主動(dòng)權(quán)轉(zhuǎn)移到接口上,依賴注入通過(guò)xml配置文件在類實(shí)例化時(shí)將其依賴類注入。

              依賴類(Dependency)是通過(guò)外部(xml)來(lái)注入的,而不是由使用它的類(Business)來(lái)自己制造,這就是依賴的注入。另一方面,Business對(duì)類Dependency的依賴轉(zhuǎn)移到對(duì)接口IDependency的依賴,控制權(quán)由類轉(zhuǎn)移到了接口,即由"實(shí)現(xiàn)"轉(zhuǎn)移到"抽象"中。這就是控制反轉(zhuǎn)。
           
          使用IoC,對(duì)象是被動(dòng)的接受依賴類,而不是自己主動(dòng)的去找。容器在實(shí)例化的時(shí)候主動(dòng)將它的依賴類注入給它。可以這樣理解:控制反轉(zhuǎn)將類的主動(dòng)權(quán)轉(zhuǎn)移到接口上,依賴注入通過(guò)xml配置文件在類實(shí)例化時(shí)將其依賴類注入。

          控制反轉(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)移到了外部容器。

          依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過(guò)程中,通常由調(diào)用者來(lái)創(chuàng)建被調(diào)用者的實(shí)例。但在Spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來(lái)完成,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者實(shí)例的工作通常由Spring容器來(lái)完成,然后注入調(diào)用者,因此也稱為依賴注入。
            簡(jiǎn)而言之:所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對(duì)象的創(chuàng)建及維護(hù),依賴對(duì)象的創(chuàng)建及維護(hù)是由外部容器負(fù)責(zé)的。這樣控制權(quán)就由應(yīng)用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是所謂反轉(zhuǎn);所謂依賴注入就是指:在運(yùn)行期,由外部容器動(dòng)態(tài)地將依賴對(duì)象注入到組件中。


          傳統(tǒng)編程和IoC的對(duì)比
          傳統(tǒng)編程:決定使用哪個(gè)具體的實(shí)現(xiàn)類的控制權(quán)在調(diào)用類本身,在編譯階段就確定了。
          IoC模式:調(diào)用類只依賴接口,而不依賴具體的實(shí)現(xiàn)類,減少了耦合。控制權(quán)交給了容器,在運(yùn)行的時(shí)候才由容器決定將具體的實(shí)現(xiàn)動(dòng)態(tài)的“注入”到調(diào)用類的對(duì)象中。


          應(yīng)用控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體將其所依賴的對(duì)象的引用傳遞給它。也可以說(shuō),依賴被注入到對(duì)象中。所以,控制反轉(zhuǎn)是,關(guān)于一個(gè)對(duì)象如何獲取他所依賴的對(duì)象的引用,這個(gè)責(zé)任的反轉(zhuǎn)。


          IoC核心理念:

          1.在類當(dāng)中不創(chuàng)建對(duì)象,在代碼中不直接與對(duì)象和服務(wù)連接

          2.在配置文件中描述創(chuàng)建對(duì)象的方式,以及各個(gè)組件之間的聯(lián)系

          3.外部容器通過(guò)解析配置文件,通過(guò)反射來(lái)將這些聯(lián)系在一起

           

          The Hollywood principle:Don’t call us,we’ll call you.

          即,所有組件都是被動(dòng)的、不主動(dòng)聯(lián)系(調(diào)用)外部代碼,

          要等著外部代碼的調(diào)用--------所有的組件的初始化和相互調(diào)用都由容器負(fù)責(zé)實(shí)現(xiàn)。

          簡(jiǎn)單的說(shuō),就是整個(gè)程序之間的關(guān)系,都由容器來(lái)控制:將程序的控制權(quán)反轉(zhuǎn)給容器,就是所謂的外轉(zhuǎn)

          而在我們傳統(tǒng)代碼中,由程序代碼直接控制


          優(yōu)缺點(diǎn):
          IoC最大的好處是什么?
              因?yàn)榘褜?duì)象生成放在了XML里定義,所以當(dāng)我們需要換一個(gè)實(shí)現(xiàn)子類將會(huì)變成很簡(jiǎn)單(一般這樣的對(duì)象都是實(shí)現(xiàn)于某種接口的),只要修改XML就可以了,這樣我們甚至可以實(shí)現(xiàn)對(duì)象的熱插拔(有點(diǎn)象USB接口和SCSI硬盤了)。
          IoC最大的缺點(diǎn)是什么?
              (1)生成一個(gè)對(duì)象的步驟變復(fù)雜了(事實(shí)上操作上還是挺簡(jiǎn)單的),對(duì)于不習(xí)慣這種方式的人,會(huì)覺(jué)得有些別扭和不直觀。
              (2)對(duì)象生成因?yàn)槭鞘褂梅瓷渚幊蹋谛噬嫌行p耗。但相對(duì)于IoC提高的維護(hù)性和靈活性來(lái)說(shuō),這點(diǎn)損耗是微不足道的,除非某對(duì)象的生成對(duì)效率要求特別高。
              (3)缺少IDE重構(gòu)操作的支持,如果在Eclipse要對(duì)類改名,那么你還需要去XML文件里手工去改了,這似乎是所有XML方式的缺憾所在。


            IOC的意思是控件反轉(zhuǎn)也就是由容器控制程序之間的關(guān)系,把控件權(quán)交給了外部容器,之前的寫法,由程序代碼直接操控,而現(xiàn)在控制權(quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移是所謂反轉(zhuǎn)






          posted on 2015-04-15 13:36 abin 閱讀(464) 評(píng)論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 额敏县| 乃东县| 鄂州市| 县级市| 容城县| 陕西省| 汪清县| 澄迈县| 江华| 团风县| 新津县| 连山| 辉南县| 额尔古纳市| 马龙县| 灵台县| 武山县| 方山县| 通州区| 濉溪县| 永济市| 绥棱县| 磐安县| 襄樊市| 五原县| 吉木乃县| 梧州市| 崇左市| 莒南县| 博爱县| 大宁县| 赫章县| 固阳县| 香格里拉县| 连州市| 西安市| 孙吴县| 峡江县| 潞西市| 乐都县| 忻州市|