Spring IOC技術簡單實現(二)

2021-10-09 08:51:52 字數 2839 閱讀 1613

在這裡我們先思考乙個場景,有bean註解且含有引數的方法該如何處理?

這裡有乙個關鍵的點是:方法所依賴的引數是否滿足。

如果滿足,則該方法是可以執行並且得到乙個bean的,如果多個方法的引數形成了迴圈依賴關係,則應將這種迴圈依賴告知使用者。下面我們先介紹乙個小例子方便大家理解什麼是迴圈依賴

// an highlighted block

@component

public

class

apublic

bgetb()

public

void

setb

(b b)

@override

public string tostring()

}

// 

@component

public

class

bpublic

cgetc()

public

void

setc

(c c)

@override

public string tostring()

}

//

@component

public

class

cpublic

ageta()

public

void

seta

(a a)

@override

public string tostring()

}

如上圖所示,a類中有b類物件,b類中有c類物件,c類中有a類物件,就會形成迴圈依賴,想這種情況需要告知使用者。

那麼該怎樣知道類之間的迴圈依賴關係呢?這裡檢測迴圈依賴就顯得尤為重要。

這裡先考慮構造methoddefination類,該類中應該儲存方法反射執行所需要的內容:

①物件②方法本身

③引數物件集合

這裡最難解決的問題時:引數所需要的物件可能是隨機滿足的

將所有不滿足依賴關係的方法中的引數形成乙個map,此map的鍵是引數型別,而值是methoddefination所形成的list,再準備乙個滿足要求的methoddefination列表。

綜上所述,需要準備三樣東西:

①不能滿足依賴關係的methoddefination列表:列表1;

②引數型別為鍵,methoddefination為值得map;

③滿足依賴關係的methoddefination:列表2;

遇到乙個帶參方法時,先檢測其所有引數;

若所有引數滿足要求,暫不處理

若引數不能得到滿足,則將這個引數型別作為鍵,這個methoddefination作為值,儲存到map中;

當對所有引數都進行了檢測,若存在未滿足的引數,則將methoddefination儲存到列表1;

當所有引數都滿足要求,則將其儲存到列表2;

在此處就需要每處理完乙個bean,都掃瞄map,將依賴這個bean的methoddefination的count- -(methoddefination中引數個數),若count值為0,則將其儲存到列表2中。

具體實現過程如下:

// an highlighted block

public

class

methoddefination

void

setobject

(object object)

void

setmethod

(method method)

void

setparacount

(int paracount)

void

setparacount

(int paracount)

method getmethod()

int getparacount()

int sub()

}

// 

public

class

methoddependence

static

void

adduninvokemethod

(methoddefination methoddefinition,

map?>

, integer> paratypepool)

list methodlist = dependencemethodpool.

get(klass)

; methodlist.

add(methoddefinition);}

}public

static

void

checkdependence

(class<

?> beanclass)

list okmethodlist =

newarraylist

();for

(methoddefination md : mdlist)}if

(!okmethodlist.

isempty()

)}dependencemethodpool.

remove

(beanclass);}

public

static

void

invokedependcemethod()

}public

static string getundependence()

}return str.

tostring()

;}}

上面便簡單地完成了迴圈依賴部分的處理。

實現簡單spring ioc框架

使用注入容器的時候新增value指定名字 使用 qualifier引入指定名字的物件 程式啟動的時候,將物件存入容器中 思路 com.hodor掃瞄路徑下的所有類 class檔案 到target目錄下掃瞄,掃瞄src目錄是沒用的,結果如com.hodor.service.orderservice 應...

Spring IOC容器的簡單實現

inverse of control 控制反轉 將原本在程式中手動建立物件的控制權,交由spring框架來管理 若要使用某個物件,只需要從 spring 容器中獲取需要使用的物件,不關心物件的建立過程,也就是把建立物件的控制權反轉給了spring框架。github只有src下的檔案和pom.xml檔...

SpringIOC框架的簡單實現步驟

依賴注入 dependency injection 簡稱 di 與控制反轉 ioc 的含義相同程式設計客棧,只不過這兩個稱呼是從兩個角度描述的同乙個概念,具體如下 依賴注入可以有效的解耦合。有兩種實現的方法,一種是配置xml檔案來實現,另一種是通過引數實現,來,找個簡單的例子讓咱們上手試一試。int...