IOC和DI到底是什嗎?,IOCDI到底
在學習Spring架構的時候,我們總是能見到IOC這個單詞,也時常聽到DI這個詞,那麼他們分別是什麼意思呢?接下來就講講個人對於這兩個概念的理解
一、IOC和DI概念
IOC(控制反轉):全稱為:Inverse of Control。從字面上理解就是控制反轉了,將對在自身對象中的一個內建對象的控制反轉,反轉後不再由自己本身的對象進行控制這個內建對象的建立,而是由第三方系統去控制這個內建對象的建立。
DI(依賴注入):全稱為Dependency Injection,意思自身對象中的內建對象是通過注入的方式進行建立。
那麼IOC和DI這兩者又是什麼關係呢?
IOC就是一種軟體設計思想,DI是這種軟體設計思想的一個實現。而Spring中的核心機制就是DI。
二、執行個體理解IOC
class Person{ private Wear clothe; public Wear getClothe() { return clothe; } public void setClothe(Wear clothe) { this.clothe = clothe; } public void Wear(){ clothe = new Sweater(); clothe.WearClothe(); } }interface Wear{ void WearClothe();}class Sweater implements Wear{ @Override public void WearClothe() { // TODO Auto-generated method stub System.out.println("穿毛衣"); } }class Shirt implements Wear{ @Override public void WearClothe() { // TODO Auto-generated method stub System.out.println("穿襯衫"); } }
public static void main(String[] args){ Person person = new Person(); person.Wear(); }
在上面的代碼中我們定義一個Wear介面,兩個實現了該介面的類Sweater和Shirt,在Person類的Wear需要調用Wear介面的WearClothe方法,傳統的做法是在Person的Wear中建立該介面的實作類別,然後通過該對象對調用這個方法。在Person對象的內部建立了這個對象,既是控制了這個對象,當我們需要調用Shirt的WearClothe方法的時候就需要改動Person類中Wear方法的代碼,去建立一個Shirt類對象。
而在IOC的設計思想中,我們將不再Person的內部進行建立Clothe屬性的引用對象,而是在外界建立該對象,然後注入到Person對象中。代碼實現如下:
修改Person類的Wear方法:
public void Wear(){ clothe.WearClothe(); }
在main方法中調用:
public static void main(String[] args){ Wear wear= new Sweater(); Person person = new Person(); person.setClothe(sweater); person.Wear(); }
通過在外界建立一個Wear介面的實作類別對象,然後將該對象傳入person對象中,將person對象對於sweater對象的控制反轉,person對象不再進行Wear介面實現對象的建立。如果我們需要調用Shirt的wear方法,只需要更改建立Shirt對象,不再需要修改Person類內部的方法,就可以實現了。
這就是我理解的IOC,簡單來說就是把本來在類內部控制的對象,反轉到類外部進行建立後注入,不再由類本身進行控制,這就是IOC的本質。