在學習Spring框架的時候,我們總是能見到IOC這個單詞,也時常聽到DI這個詞,那麼他們分別是什麼意思呢?接下來就講講個人對於這兩個概念的理解 一、IOC和DI概念 IOC(控制反轉):全稱為:Inverse of Control。從字面上理解就是控制反轉了,將對在自身對象中的一個內置對象的控制反
在學習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的本質。