了解Spring的核心依賴注入和控制反轉(zhuǎn)IOC之前需要先了解一下,之前客戶端是如何處理這件事情的。
客戶案例--創(chuàng)造一臺汽車
/傳統(tǒng)方式處理/
首先我們知道客戶端創(chuàng)建一個對象,比如一臺汽車,需要new car 。這個時候我們知道car還需要引擎engine。 所以我們又需要new 一個engine。 并讓engine注入到car中. 那么一臺汽車就好了。 這個時候就有一個問題,就是汽車需要量產(chǎn),我們需要1000臺汽車cars. 如果按照傳統(tǒng)的做法就是我們需要new 1000car ,同時還要new 1000個engine。 這樣非常復(fù)雜,同時占用了相當(dāng)大的內(nèi)存。這個就是傳統(tǒng)的正轉(zhuǎn)。
/Spring控制反轉(zhuǎn)和依賴注入處理方式/
Spring控制反轉(zhuǎn)IOC的意思就是你不用顯示的在一個類里用new關(guān)鍵字來生成你想要的對象而只需在xml配置文件里添加相應(yīng)節(jié)點(diǎn)即可,這樣就讓你整個程序的組成變得靈活多樣。 之前的方式是由客戶端主動的去new cars和engine這些東西。現(xiàn)在的方式是Spring提供IOC也就是控制反轉(zhuǎn)的一個思想。 所有的創(chuàng)建類都由IOC容器創(chuàng)建好。比如客戶端需要一輛car,以及engine。那么在客戶端需要之前,IOC容器就已經(jīng)new了一個car,和engine. 并且將engine已經(jīng)注入到car里面去了。 也就是客戶端需要car,IOC就主動將裝配完畢的car給客戶端了。也就是說控制反轉(zhuǎn)就是之前由客戶端程序控制創(chuàng)建的機(jī)制,變?yōu)镮OC容器來控制創(chuàng)建的反轉(zhuǎn)。 依賴注入就是客戶端程序依賴于IOC容器去注入程序所需要的類也就是外部資源。
/那么還有一個問題,當(dāng)客戶端服務(wù)器需要1000個car的時候,IOC容器是如何體現(xiàn)控制反轉(zhuǎn)和依賴注入的好處的呢?/ 我們知道傳統(tǒng)的方式是客戶端程序需要new 1000個car 以及1000個engine。造成了資源的浪費(fèi)。 由于控制反轉(zhuǎn)這里IOC容器是在客戶端程序需要car之前就已經(jīng)將car創(chuàng)建完畢,所以1000 car在每次創(chuàng)建的時候只開辟一個內(nèi)存空間給car,和另一個內(nèi)存空間給engine。然后將car依賴engine得到最終的car。 然后重復(fù)1000次就完成了創(chuàng)建。這樣就有效的節(jié)約了內(nèi)存資源。 創(chuàng)建car,依賴于engine的例子類似于公司員工需要使用打印機(jī)的案例。10個員工需要打印機(jī),公司不可能就買10個打印機(jī)。而是只買一個,然后先后打印的方式完成。
代碼示例
/***一個人是中國人的時候說:你好,中國。是外國人的時候說:HelloWorld ***/
1.所需要的類
這里我們需要HelloChina的類來說中文,以及另一個HelloWorld的類來說英語。同時我們定義了一個接口IHellloWorld接口類。還有我們需要一個人來說,所以我們定義了Person類,并擁有IHelloMessage屬性,以及say方法。代碼如下:
2.主方法
在主Main方法中讀取Spring配置文件helloMessage來獲取程序所需要的外部資源Person.而不再是通過new來創(chuàng)建。代碼如下
3.Spring配置文件helloMessage.xml的配置
Spring的依賴注入和控制反轉(zhuǎn)都是通過配置文件進(jìn)行實(shí)現(xiàn)的。每一個Bean都對應(yīng)相應(yīng)的一個類。本例中Bean了HelloWorld,HelloChina,Person三個類。同時前面兩個又是通過依賴的方式給到Person中。此處我們依賴的是HelloWorld這個類。 具體代碼如下:
4.輸出結(jié)果
根據(jù)配置文件中,Person屬性helloMessage依賴的不同實(shí)現(xiàn)類,打印的結(jié)果也會不同。