IOC控制反轉,DI依賴注入,DIP依賴倒置,原理解析
阿新 • • 發佈:2022-05-10
什麼是IOC,DI,IOC,DI解決了什麼問題,IOC,DI的原理是什麼?
- 什麼是IOC,IOC的意義是控制反轉,DI是依賴注入,兩者息息相關,換個角度說IOC是一個概念而DI是其實現
例1:
public class B {
public void printB() {
System.out.print("this is B");
}
}
public class A {
public void main() {
B b = new B();
b.printB();
}
}
- 上述兩個類 A類依賴B類才能實現相關業務邏輯,那麼A類又可以叫主控類,或主控方
- 在這個過程當中,A類自己進行了物件的例項化
- 那麼控制反轉的意思就是我們將物件例項化的過程交給容器,主控方A類不在負責B的例項化
- 容器負責物件的例項化過程並且裝配給A類這不就控制反轉了
- 什麼是依賴注入原本是我們自己去完成物件例項化,現在是容器直接注入給我們不就是依賴注入
- 舉例說明
public class Container { public void mian() { A obj = new A(new B()); obj.setB(new B()); } } public class B { public void printB() { System.out.print("this is B"); } } public class A { public B b; A(B b) { this.b = b; } public void setB(B b) { this.b = b; } public void main() { this.b.printB(); } }
- IOC和DI解決了什麼問題,軟體開發必須要遵循OCP原則,但是在軟體開發過程中類與類之間的依賴關係往往非常複雜,那麼這就很難符合OCP
- 而造成這個問題的主要原因是,具體類自己負責了物件的例項化過程
- 如果我們用面向抽象的方式開發並且將類例項化的過程交給容器,那我們的程式碼是不是就足夠穩定?
public interface IB { void printB(); } public class B implements IB { public void printB() { System.out.print("this is B"); } } public class A { public IB ib; A(IB b) { this.ib = b; } public void setB(IB b) { this.ib = b; } public void main() { this.ib.printB(); } }
- 上述程式碼我們將物件例項化控制權交給容器,就是IOC,容器給我們注入了物件就是依賴容器,同時它也符合了OCP原則 無論B類如何變化,都不會影響A類,所以A類足夠穩定
- 得出結論IOC與DI的原理是為OCP服務
什麼是DIP
- 高層模組不能依賴底層模組,它們都應該依賴抽象
- 細節應該依賴抽象
- 抽象不能依賴細節
- DIP的概念就是說具體類應該依賴抽象,抽象不能依賴具體類,概念是為開發服務的,DIP,IOC,DI,的概念都是為了更好的實現OCP而服務