python ioc框架 IOC 實現原理

2021-10-12 10:51:54 字數 1407 閱讀 7465

ioc 也就是「控制反轉」了,不過更流行的叫法是「依賴注入」(di - dependency injection)。聽起來挺高深,其實實現起來並不複雜。下面就看看如何來實現這個輕量級 ioc 框架。

從例項出發,先看看以下 action **。

@bean

public class productaction extends baseaction ")

public result getproductbyid(long productid) else catch (exception e) 其實很簡單,依賴注入其實分為兩個步驟:1. 通過反射建立例項;2. 獲取需要注入的介面實現類並將其賦值給該介面。以上**中的兩個 for 迴圈就是幹這兩件事情的。

依賴注入框架實現完畢!

請大家給出評價,謝謝!

補充(2013-09-05)

有些網友對如何尋找介面的實現類的演算法有些疑問,如果乙個介面存在兩個實現類,應該獲取哪乙個實現類呢?我之前的做法是,只獲取第乙個實現類。而 spring 的做法是,直接報錯,應用都起不來。經過反覆思考,我做了乙個慎重的決定,就是在介面上使用 @impl 註解來強制指定哪個實現類。而 beanhelper 在做依賴注入的時候,會首先判斷介面上是否有 @impl 註解,如果有就獲取這個強制指定的實現類例項,否則就獲取所有實現類中的第乙個實現類,仍然不會像 spring 那樣讓應用報錯。下面是對 beanhelper 類中部分**的修改:

// 判斷當前 bean 字段是否帶有 @inject 註解

if (beanfield.isannotationpresent(inject.class)) else 假設這個介面的實現類是 productserviceimpl2。

這個解決方案相信大家還是滿意的吧?

補充(2013-09-12)

這違法了設計模式中的「單一責任原則」,所有有必要將其重構一下,現在的 beanhelper 類更加苗條了,只是負責初始化 bean 類而已。**如下:

public class beanhelper catch (exception e) 那麼,依賴注入功能放**呢?我搞了乙個 iochelper,用這個類來實現 ioc 功能。**如下:

public class iochelper else catch (exception e) 可見,iochelper 是依賴於 beanhelper 的。這樣分離,還有乙個好處,就是方便實現 servicehelper 與 aophelper。也就是說,首先通過 beanhelper 初始化所有的 bean 類,然後依次初始化 servicehelper、iochelper、aophelper,這個順序不能搞錯。因為在 servciehelper 中,對 servcie 實現類進行了動態**,所***了 ioc 注入進來的是**類,而並非目標類。

在 aophelper 中也做了動態**的實現,詳情請見《aop 實現原理》。

spring框架Ioc學習

理解 1 在ioc沒有出現之前,如果物件a需要依賴物件b,那麼在a初始化或執行到某乙個點的時候,需要去建立或者呼叫已經建立的物件b.不管是建立還是直接呼叫,控制權都在自己手裡.2 ioc出現之後,如果物件a需要依賴物件b,這是會有乙個容器來管理這種需求,將物件b注入到物件a中,這樣乙個容器我們稱之為...

spring框架溫習 IOC

ioc控制反轉,降低 之間的耦合度。把物件的建立交給spring來完成 實現方法 1.xml配置檔案方式 2.註解方式 使用的技術 xml配置檔案 dom4j解析xml檔案 工廠設計模式 反射 實現原理 問題 controller需要呼叫service,不通過new 修改乙個地方,需要找找找改改改 ...

spring框架IOC配置

ing context 3.2.xsd chema tx chema tx spring tx.xsd chema aop chema aop spring aop.xsd p gzsc 18000 111aaaa bbbb 9999 8888 user wwww 50可以通過註解方法,就不用在xm...