IOC實現原理

2021-07-25 22:01:37 字數 2675 閱讀 2683

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

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

@bean

public

class

productaction

extends

baseaction ")

public result getproductbyid(long productid)

product product = productservice.getproduct(productid);

if (product != null) else

}}

以上使用了兩個自定義註解:@bean 與 @inject。

在 productaction 類上標註了 @bean 註解,表示該類會交給「容器」處理,以便加入依賴注入框架。

在 produceservice 欄位上標註了 @inject 註解,表示該字段將會被注入進來,而無需 new productserviceimpl(),實際上 new 這件事情不是我們做的,而是框架做的,也就是說控制權正好反過來了,所以「依賴注入(di)」也稱作「控制反轉(ioc)」。

那麼,應該如何實現依賴注入框架呢?首先還是看看下面的 beanhelper 類吧。

public

class

beanhelper

// 遍歷 bean map

for (map.entry, object> beanentry : beanmap.entryset()) }}

}}

} catch (exception e)

}public

static map, object> getbeanmap()

@suppresswarnings("unchecked")

public

static

t getbean(classcls)

}

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

依賴注入框架實現完畢!

請大家給出評價,謝謝!

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

...

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

if (beanfield.isannotationpresent(inject.class)) else

}// 若存在實現類,則執行以下**

if (implementclass != null)

}...

在介面中是這樣使用的:

@impl(productserviceimpl2.class)

public

inte***ce

productservice

假設這個介面的實現類是 productserviceimpl2。

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

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

public

class

beanhelper

} catch (exception e)

}public

static map, object> getbeanmap()

@suppresswarnings("unchecked")

public

static

t getbean(classcls)

}

那麼,依賴注入功能放**呢?我搞了乙個 iochelper,用這個類來實現 ioc 功能。**如下:

public

class

iochelper else

}// 若存在實現類,則執行以下**

if (implementclass != null) }}

}}

}} catch (exception e)

}}

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

IOC底層實現原理

1.基本概念 ioc 控制反轉,建立物件的方式由傳統的new方式的建立轉變成交給spring容器進行管理。2.底層實現 2.1 為什麼會出現ioc 且看一段 class user 傳統呼叫user類的add方法使用new方式建立user物件,然後再呼叫add方法。該種方式缺點 耦合度高。於是人們對以...

IOC容器原理與實現

spring ioc主要分為兩個過程 ioc容器初始化 依賴注入 ioc容器初始化主要分為三個過程 第乙個過程,resource定位過程,這個過程如能主要是beandefintion的資源定位,主要就是找到定義bean的檔案。第二個過程,beandefinition的載入過程,這個載入過程就是把使用...

Spring 底層IOC實現原理

總結 工廠 反射 配置檔案 即 spring底層實現的 ioc 控制反轉 一般用到的方法是依賴注入,還有依賴查詢。原理如上圖所示,當需要乙個物件時,我們不用去new乙個物件,而只需要宣告,然後交給工廠去從配置檔案中去得到所需要的類資訊,進行類的建立返回給宣告的引用,這就是控制反轉。注意 ioc 控制...