你真的思考過IOC容器嗎?
來自專欄猿論16 人贊了文章
Ioc概念
很多初學者在剛聽到Ioc和DI等概念的時候,往往一頭霧水,用了很久才理解它們的意思,這裡我說一下我對它們的理解。
IOC(Inversion Of Control,反轉控制)一般也被理解為DI(Dependency Injection,依賴注入),實際上兩者還是略微有些區別,雖然它們經常性的出現在一起。
Ioc是把對象的控制權較給框架或容器,容器中存儲了眾多我們需要的對象,然後我們就無需再手動的在代碼中創建對象。需要什麼對象就直接告訴容器我們需要什麼對象,容器會把對象根據一定的方式注入到我們的代碼中。注入的過程被稱為DI。有時候需要動態的指定我們需要什麼對象,這個時候要讓容器在眾多對象中去尋找,容器尋找需要對象的過程,稱為DL(Dependency Lookup, 依賴查找)。
按照上面的理解,那麼IOC包含了DI與DL,並且多了對象註冊的過程。
Ioc是一種設計模式,一種概念,主要包含的內容如下:
- 對象的生命周期的管理
- 依賴的解析與注入
- 依賴的查詢
- 應用的配置
Ioc的優點
IOC容器給我們提供的最大便利之處就是更容易實現可插拔,可替換的組件。這也是介面驅動開發所帶來的優勢,根據介面可以提供更多靈活的子類實現,增強代碼的健壯性和穩定性。
Ioc管理的組件一般是實現了某些介面的類,這些組件又會使用其它的實現某些介面的組件,它們都不需要知道介面的具體實現,因為這,組件間的替換才會如此容易。容器的任務就是幫我們創建組件的具體事例,並且把管理它們的依賴關係,把所需的具體依賴傳給組件。
一個有關Ioc的案例
市場上實現Ioc的容器有多種:像Guice, Spring, Jboss等。
我們使用Spring來做一個案例:
- 首先下載Spring的lib,添加Jar包依賴
- 寫測試程序
// HelloWorld介面與它的實現public interface HelloWord { void sayHello();}public class HelloWordImpl1 implements HelloWord { @Override public void sayHello() { System.out.println("hello1"); }}public class HelloWordImpl2 implements HelloWord { @Override public void sayHello() { System.out.println("hello2"); }}
- 新建Spring配置文件,Spring的配置可以試Java配置,也可以是xml配置,我們使用Java配置。
@Configurationpublic class BeanConfig { @Bean public HelloWord helloWord(){ //我們可以在此處創建HelloWorld的實現,在注入的時候直接指定相應的類就好了 return new HelloWordImpl1(); }}
- 運行程序
public class App { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext("me.aihe"); HelloWord helloWord = applicationContext.getBean(HelloWord.class); helloWord.sayHello(); }}// 運行結果hello1//當修改BeanConfig的返回HelloWorld的Bean為HelloWorldImp2時//運行結果為hello2
以上是一個簡單案例,但是可以稍微由此得出一些Ioc的有點:
- 在應用代碼中,我們無需使用new關鍵字新建對象。在業務代碼中太多的new對象會導致代碼耦合度過高。
- 應用中只需要使用HelloWorld的介面,不用關心HelloWorld介面的實現。我們只是告訴ApplicationContext,我們需要HelloWorld類型的對象,然後就獲得了一個對象。
對象關係圖:
應用無需關心組件,只需要從容器中拿。
小結
這裡我們提到了Ioc的概念,控制反轉,對象控制權由對象本身轉向容器;依賴注入,容器管理組件的依賴關係並提供對應的依賴對象。然後說了IOC的優點:
- 減少代碼的耦合,可以使應用更加模塊化
- 增加代碼的復用率
- 資源更加統一管理
- 維護代碼更加方便,一般只需要修改一下配置文件就ok了。
- 提升了程序的測試性
這裡僅僅是個人對IOC的理解,如果想要有更深入的理解,可以查閱更加權威的書籍與資料。
參考
- 控制反轉
- Ioc有什麼好處呢
作者:艾賀521
鏈接:https://www.imooc.com/article/35099
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀:
【重磅】認證作者招募 | 打造個人品牌 so easy !
js代碼常見技巧總結
so easy 前端簡單實現多語言
在騰訊實習一年,我學到了什麼
程序員偷偷深愛的 9 個不良編程習慣
推薦閱讀:
※語法分析技術簡介
※學長學姐說||在麻省埃莫斯特分校讀CS是怎樣一種體驗?
※1-22 第一部分的結語
※網路基本功(十三):細說Linux網路配置(下)
※如何開啟MySQL慢查詢日誌