DI(Dependency Injection) 依賴注入
DI : 應用程序依賴容器建立並注入它所須要的外部資源,動態的向某個對象提供它所須要的其餘對象
A(依賴於C) -> 依賴 -> Container(獲取C,做爲外部資源) -> 將C注入(構造,方法,註解等方式) -> A
A 依賴於 容器,爲何 ?
A 須要 容器提供的外部資源(C)
容器資源(C) 注入到 A
好處 : 提高組件重用的頻率,併爲系統搭建一個靈活、可擴展的平臺。
IOC(Inversion of Control) 控制反轉
依賴關係的控制反轉到調用鏈的起點。這樣你能夠徹底控制依賴關係,經過調整不一樣的注入對象,來控制程序的行爲。
例如 IocFoo 類用到了memcache,能夠在不修改 IocFoo 類代碼的狀況下,改用redis。
正轉: IocFoo 須要 RedisCache,在 IocFoo 獲取 RedisCahce對象,進行處理。
反轉: IocFoo 再也不主動去獲取 RedisCache對象,而是被動等待。等待 IOC/DI容器獲取 RedisCache,而後反向注入到 IocFoo 中。
IOC/DI 容器
DI : 應用程序依賴容器建立並注入它所須要的外部資源
A(依賴於C) -> 依賴 -> Container(獲取C,做爲外部資源) -> 將C注入(構造,方法,註解等方式) -> A
IOC : 容器控制應用程序,由容器反向的嚮應用程序注入應用程序所須要的外部資源,依賴對象的獲取被反轉了
控制 : IOC 容器控制了對象,主要控制了外部資源獲取(對象、文件、資源等)。
正轉 : 對象中主動控制去直接獲取依賴對象, 對象 主動獲取 依賴
反轉 : 由容器來幫忙建立及注入依賴對象 , 容器 注入依賴 到對象中
A(依賴於C,不主動獲取) -> 被動等待
∧
|
Container(獲取C,做爲外部資源,注入到A中)
好處 : 有效的分離了對象和它所須要的外部資源,使得它們鬆散耦合,有利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。
Container(容器)
容器負責實例化,注入依賴,處理和管理依賴關係等工做。
DI Container (dependency injection container) 依賴注入容器
真實的dependency injection container會提供更多的特性,如
自動綁定(Autowiring)或 自動解析(Automatic Resolution)
註釋解析器(Annotations)
延遲注入(Lazy injection)
代碼參考