ioc的概念介紹
控制反轉(ioc)模式(又稱di:dependency injection)就是inversion of control,控制反轉。在java開發中,ioc意 味著將你設計好的類交給系統去控制,而不是在你的類內部控制。這稱為控制反轉。
控制反轉(inversion of control,英文縮寫為ioc)是框架的重要特征,做到控制反轉需要一個容器來實現,就是我們所說的ioc容器,最常見的ioc容器是spring。
控制反轉從字面意思看來不是很好理解,其實就是將創建管理對象的工作交給容器來做。在以前的編程中,創建一個對象需要顯式的new出來,但是控制反轉是在容器初始化(或者某個指定時間節點)時通過反射機制(上一篇文章有介紹)創建好對象,在使用時去容器中獲取。將對象的控制權反過來交給容器管理,所以稱之為“控制反轉”。
一、ioc容器是怎么實現的呢?
ioc容器的底層實現其實是工廠模式,通過工廠模式和反射機制,根據xml中給出的類名生成相應的對象。其實ioc容器的實現很簡單,就是一個hashmap,接下來,我們實現一個簡單的ioc容器:
1.讀取配置文件,并初始化容器
配置文件可以是xml或者properties文件,下面代碼是讀取兩種配置文件創建實例,并放到容器中(容器的實現是hashmap):
(1)讀取xml配置文件,創建實例放進容器的實現:
讀取xml創建容器
(2)讀取properties文件,創建實例放進容器的實現:
讀取properties創建容器
2.applicationcontextfactory工廠的實現(調用初始化容器的方法)
通過工廠創建應用上下文中配置的對象,在此工廠中判斷是否存在xml或prop文件,并初始化容器:
applicationcontextfactory工廠的實現
3.容器的使用
通過工廠創建完容器就可以使用了,調用getbean(string beanid)方法獲取容器中的對象實例:
容器的使用
二、依賴注入(di,dependency injection)和依賴查找(dependency lookup)是什么?
依賴注入和依賴查找是ioc的兩種主要實現方式,我直接把依賴查找給扔了沒去理解他,一般會把ioc和di放在一起說。
其實可以把di和ioc理解為同一件事,都是把創建實例的控制權交給容器來操作,只是兩種叫法的角度不同:
控制反轉是從代碼操作對象的角度來看,將操作對象的控制權反轉交給了容器;
依賴注入是從容器的角度看,我把你需要的對象或屬性注入到你代碼中去。
原文鏈接:http://www.toutiao.com/a6440796552093450498/