了解Spring的核心依賴注入和控制反轉(zhuǎn)IOC之前需要先了解一下冕末,之前客戶端是如何處理這件事情的楔脯。
客戶案例--創(chuàng)造一臺(tái)汽車
/傳統(tǒng)方式處理/
首先我們知道客戶端創(chuàng)建一個(gè)對(duì)象,比如一臺(tái)汽車鸣戴,需要new car 啃沪。這個(gè)時(shí)候我們知道car還需要引擎engine。 所以我們又需要new 一個(gè)engine葵擎。 并讓engine注入到car中. 那么一臺(tái)汽車就好了谅阿。 這個(gè)時(shí)候就有一個(gè)問(wèn)題,就是汽車需要量產(chǎn)酬滤,我們需要1000臺(tái)汽車cars. 如果按照傳統(tǒng)的做法就是我們需要new 1000car ,同時(shí)還要new 1000個(gè)engine。 這樣非常復(fù)雜寓涨,同時(shí)占用了相當(dāng)大的內(nèi)存盯串。這個(gè)就是傳統(tǒng)的正轉(zhuǎn)。
/Spring控制反轉(zhuǎn)和依賴注入處理方式/
Spring控制反轉(zhuǎn)IOC的意思就是你不用顯示的在一個(gè)類里用new關(guān)鍵字來(lái)生成你想要的對(duì)象而只需在xml配置文件里添加相應(yīng)節(jié)點(diǎn)即可戒良,這樣就讓你整個(gè)程序的組成變得靈活多樣体捏。 之前的方式是由客戶端主動(dòng)的去new cars和engine這些東西。現(xiàn)在的方式是Spring提供IOC也就是控制反轉(zhuǎn)的一個(gè)思想糯崎。 所有的創(chuàng)建類都由IOC容器創(chuàng)建好几缭。比如客戶端需要一輛car,以及engine。那么在客戶端需要之前沃呢,IOC容器就已經(jīng)new了一個(gè)car,和engine. 并且將engine已經(jīng)注入到car里面去了年栓。 也就是客戶端需要car,IOC就主動(dòng)將裝配完畢的car給客戶端了薄霜。也就是說(shuō)控制反轉(zhuǎn)就是之前由客戶端程序控制創(chuàng)建的機(jī)制某抓,變?yōu)镮OC容器來(lái)控制創(chuàng)建的反轉(zhuǎn)。 依賴注入就是客戶端程序依賴于IOC容器去注入程序所需要的類也就是外部資源惰瓜。
/那么還有一個(gè)問(wèn)題否副,當(dāng)客戶端服務(wù)器需要1000個(gè)car的時(shí)候,IOC容器是如何體現(xiàn)控制反轉(zhuǎn)和依賴注入的好處的呢?/ 我們知道傳統(tǒng)的方式是客戶端程序需要new 1000個(gè)car 以及1000個(gè)engine崎坊。造成了資源的浪費(fèi)备禀。 由于控制反轉(zhuǎn)這里IOC容器是在客戶端程序需要car之前就已經(jīng)將car創(chuàng)建完畢,所以1000 car在每次創(chuàng)建的時(shí)候只開(kāi)辟一個(gè)內(nèi)存空間給car,和另一個(gè)內(nèi)存空間給engine。然后將car依賴engine得到最終的car曲尸。 然后重復(fù)1000次就完成了創(chuàng)建呻待。這樣就有效的節(jié)約了內(nèi)存資源。 創(chuàng)建car,依賴于engine的例子類似于公司員工需要使用打印機(jī)的案例队腐。10個(gè)員工需要打印機(jī)蚕捉,公司不可能就買10個(gè)打印機(jī)。而是只買一個(gè)柴淘,然后先后打印的方式完成迫淹。
代碼示例
/***一個(gè)人是中國(guó)人的時(shí)候說(shuō):你好,中國(guó)为严。是外國(guó)人的時(shí)候說(shuō):HelloWorld ***/
1.所需要的類
這里我們需要HelloChina的類來(lái)說(shuō)中文敛熬,以及另一個(gè)HelloWorld的類來(lái)說(shuō)英語(yǔ)。同時(shí)我們定義了一個(gè)接口IHellloWorld接口類第股。還有我們需要一個(gè)人來(lái)說(shuō)应民,所以我們定義了Person類,并擁有IHelloMessage屬性夕吻,以及say方法诲锹。代碼如下:
2.主方法
在主Main方法中讀取Spring配置文件helloMessage來(lái)獲取程序所需要的外部資源Person.而不再是通過(guò)new來(lái)創(chuàng)建。代碼如下
3.Spring配置文件helloMessage.xml的配置
Spring的依賴注入和控制反轉(zhuǎn)都是通過(guò)配置文件進(jìn)行實(shí)現(xiàn)的涉馅。每一個(gè)Bean都對(duì)應(yīng)相應(yīng)的一個(gè)類归园。本例中Bean了HelloWorld,HelloChina,Person三個(gè)類。同時(shí)前面兩個(gè)又是通過(guò)依賴的方式給到Person中稚矿。此處我們依賴的是HelloWorld這個(gè)類庸诱。 具體代碼如下:
4.輸出結(jié)果
根據(jù)配置文件中,Person屬性helloMessage依賴的不同實(shí)現(xiàn)類晤揣,打印的結(jié)果也會(huì)不同桥爽。