首先說(shuō)明 IoC 是一種思想,IoC的全稱是Inversion of Control,翻譯成中文叫做“控制反轉(zhuǎn)”
用人話來(lái)說(shuō),IoC的思想就是將一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象的控制權(quán)交出去(不必關(guān)心交給誰(shuí)),從而讓對(duì)象之間的依賴關(guān)系降低,降低代碼之間耦合程度。
我們可以寫(xiě)一個(gè)簡(jiǎn)單的代碼來(lái)舉個(gè)例子
假如說(shuō)我們現(xiàn)在要“造一臺(tái)車(chē)”,那么我們首先需要一個(gè)車(chē)框架
public class Car {
FrameWork frameWork;
public Car(){
frameWork.init();
}
}
那么造好了車(chē)框架,我們需要在車(chē)框架上面安裝一個(gè)底盤(pán)
public class FrameWork {
Bottom bottom;
public FrameWork(){
bottom = new Bottom();
bottom.init();
}
public void init(){
System.out.println("i am framework......");
}
}
那么造好了底盤(pán),我們需要在底盤(pán)合適的位置安裝好輪胎
public class Bottom {
Tire tire;
public Bottom(){
tire = new Tire();
tire.init();
}
public void init(){
System.out.println("i am framework......");
}
}
最后我們需要把輪胎造好,那么這輛車(chē)就拼裝完成了
public class Tire {
public void init(){
System.out.println("i am tire......");
}
}
假設(shè)我們有一天想要一輛定制的車(chē),比如我想要一輛輪胎是17寸大小的車(chē),那么我就需要傳遞參數(shù)將代碼進(jìn)行修改
//輪胎
public class Tire {
int size;
public Tire(int size){
this.size = size;
}
public void init(){
System.out.println("i am " + size + "tire......");
}
}
//底盤(pán)
public class Bottom {
Tire tire;
public Bottom(int size){
tire = new Tire(size);
tire.init();
}
public void init(){
System.out.println("i am framework......");
}
}
//框架
public class FrameWork {
Bottom bottom;
public FrameWork(int size){
bottom = new Bottom(size);
bottom.init();
}
public void init(){
System.out.println("i am framework......");
}
}
//車(chē)
public class Car {
FrameWork frameWork;
public Car(int size){
frameWork = new FrameWork(size);
frameWork.init();
}
}
可以看到,我們需要層層向上,不斷地修改代碼來(lái)傳遞參數(shù),從而達(dá)到“定制化的過(guò)程”
那么如果我們使用IoC的思想來(lái)實(shí)現(xiàn)這個(gè)“車(chē)”,代碼應(yīng)該就是這樣的
public class FrameWork {
public FrameWork(Bottom bottom){
bottom.init();
}
public void init(){
System.out.println("i am framework......");
}
}
public class Bottom {
public Bottom(Tire tire){
tire.init();
}
public void init(){
System.out.println("i am bottom......");
}
}
public class FrameWork {
public FrameWork(Bottom bottom){
bottom.init();
}
public void init(){
System.out.println("i am framework......");
}
}
public class Car {
public Car(FrameWork frameWork){
frameWork.init();
}
}
public static void main(String[] args) {
Tire tire = new Tire(17);
Bottom bottom = new Bottom(tire);
FrameWork frameWork = new FrameWork(bottom);
Car car = new Car(frameWork);
}
我們使用IoC的思想來(lái)寫(xiě)代碼可以發(fā)現(xiàn),當(dāng)我們對(duì)Tire這個(gè)類(lèi)進(jìn)行修改的時(shí)候,只需要在創(chuàng)建Tire的時(shí)候傳入?yún)?shù)就可以完成修改了,并不需要再像以前一樣層層遞歸的修改代碼。
通過(guò)IoC的思想我們讓代碼的耦合程度降低,讓代碼更加的靈活,讓程序更加的簡(jiǎn)單了
說(shuō)完了IoC,那么就來(lái)談?wù)勈裁词荢pring IoC
Spring IoC就是實(shí)現(xiàn)了具體IoC思想的框架,在這個(gè)Spring框架中存在一個(gè)IoC容器,通過(guò)這個(gè)容器我們可以存對(duì)象,也可以取對(duì)象。等同于說(shuō)我們將對(duì)象的創(chuàng)建與銷(xiāo)毀都交給了IoC容器來(lái)進(jìn)行管理,同時(shí)在這個(gè)容器中既可以存對(duì)象也可以取對(duì)象!
那么什么是DI呢?DI全稱“Dependency Injection”,翻譯成中文是依賴注入
DI實(shí)際上就是對(duì)IoC思想的具體實(shí)現(xiàn)方式,我們通過(guò)依賴注入的方法,從Spring容器中取出對(duì)象,注入到對(duì)象中去!由于Spring IoC容器的存在,我們?cè)诖鎯?chǔ)對(duì)象的時(shí)候就將依賴關(guān)系交給Spring IoC容器來(lái)進(jìn)行托管了,當(dāng)我們創(chuàng)建對(duì)象并使用注入的方式,就可以自動(dòng)的將該對(duì)象所依賴的對(duì)象注入到該對(duì)象中。這就是DI,實(shí)現(xiàn)了具體的IoC思想的行為!
舉個(gè)例子
在傳統(tǒng)的編程方式中,當(dāng)類(lèi)A依賴于類(lèi)B時(shí),我們通常會(huì)在創(chuàng)建A的實(shí)例時(shí),手動(dòng)創(chuàng)建B的實(shí)例并將其傳遞給A的構(gòu)造函數(shù)或者通過(guò)其他方式設(shè)置依賴關(guān)系。這樣的做法在小規(guī)模項(xiàng)目中可能沒(méi)有問(wèn)題,但隨著項(xiàng)目規(guī)模的增大,依賴關(guān)系的管理將變得復(fù)雜而且容易出錯(cuò)。
而在DI(依賴注入)中,Spring IoC容器會(huì)負(fù)責(zé)管理所有的bean對(duì)象的創(chuàng)建和依賴關(guān)系。當(dāng)創(chuàng)建A的實(shí)例時(shí),Spring IoC容器會(huì)自動(dòng)檢查A所依賴的B是否已經(jīng)在容器中創(chuàng)建,并將B的實(shí)例自動(dòng)注入到A中,無(wú)需手動(dòng)介入。
這種方式的好處在于:
- 解耦:類(lèi)A不需要關(guān)心B是如何創(chuàng)建的,也不需要負(fù)責(zé)B的生命周期管理。
- 靈活性:如果需要更換B的實(shí)現(xiàn),只需在配置文件中修改B的配置即可,而不需要修改A的代碼。
- 可測(cè)試性:在測(cè)試時(shí),可以輕松地將虛擬的B實(shí)例注入到A中,以便進(jìn)行單元測(cè)試。
總之,DI通過(guò)將對(duì)象之間的依賴關(guān)系交由IoC容器來(lái)管理,使得代碼更加清晰、易于維護(hù),同時(shí)也提高了項(xiàng)目的靈活性和可測(cè)試性。
我們?cè)僖詮N師做菜為例子
DI的過(guò)程如下:
- 廚子需要準(zhǔn)備一道菜,而這道菜需要食材。
- 廚子并不直接去尋找或創(chuàng)建食材,而是通過(guò)向食材供應(yīng)商(想象成IoC容器)請(qǐng)求所需的食材。
- 食材供應(yīng)商根據(jù)廚子的請(qǐng)求,提供相應(yīng)的食材,即便如此,食材的獲取和管理都是由食材供應(yīng)商來(lái)完成。
- 廚子接收到食材后,根據(jù)食譜,進(jìn)行烹飪并最終完成了一道美味的菜品。
這個(gè)例子中,廚子(我們)就是應(yīng)用程序的主體,而食材供應(yīng)商(DI容器,如Spring IoC容器)則負(fù)責(zé)管理和提供依賴(食材)。廚子無(wú)需關(guān)心如何獲取食材(依賴),只需要向供應(yīng)商(容器)說(shuō)明需要什么依賴,供應(yīng)商會(huì)將所需的依賴注入到廚子中。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-634735.html
這就是為什么DI是實(shí)現(xiàn)了具體IoC思想的行為,因?yàn)槲覀兊闹黧w不再控制依賴了,而是通過(guò)注入的方式來(lái)實(shí)現(xiàn)依賴!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-634735.html
到了這里,關(guān)于什么是IoC?什么是Spring IoC?什么是DI?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!