在這裡我們先思考乙個場景,有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...