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í)將其依賴類注入。
控制反轉(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)用者,因此也稱為依賴注入。
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)代碼中,由程序代碼直接控制
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硬盤了)。
(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)。