繼前一篇博文。把bean放入到beanpool中更靈活的方式是通過給方法加@bean註解,把方法返回值封裝成乙個bean,put到beanpool中。
處理有bean註解且含有引數的方法的關鍵:
方法所依賴的引數是否滿足?
滿足:反射機制執行這個方法,並且把把返回值放入beanpool
不滿足:應該把不滿足的方法封裝成乙個methoddefinition存起來。
而且當有乙個新的bean被put到beanpool時,可能這個bean就是方法唯一需要的bean,所以要檢查這個不能滿足的方法集是否有變化。
綜上所述:
準備3種東西:
不能滿足依賴關係的methoddefinition列表:列表1;
滿足了依賴關係的methoddefinition列表:列表2。
引數型別為鍵,methoddefinition形成的list為值的map;
(鍵是引數,是beanpool中沒有的引數型別。值是由需要這個引數的methoddefinition形成的list)
遇到乙個帶參方法,先檢測其所有引數;
若引數滿足要求,則處理下乙個引數。
若引數不能得到滿足,先到map中檢視這個引數型別再map中有沒有對應鍵,有則在這個鍵對應的list中add這個methoddefinition。沒有則put乙個新的鍵值對。(引數型別為鍵,methoddefinition形成的list為值)
當對所有引數都進行了檢測,若存在未滿足的引數,
則,將methoddefinition儲存到列表1;
當所有引數都滿足要求,則,將其儲存到列表2;
每處理完乙個bean,都要掃瞄map,將依賴這個bean的list中的每個methoddefinition的
得不到的引數count–,並且清空這個bean對應的list容器。
若list中某個methoddefinition的count為0了(count封裝在methoddefinition,表示這個方法目前還有count個引數還得不到),則,將其儲存到列表2中。
在每次包掃瞄結束後,都要執行列表2中的所有方法。
public
class
methoddependence
static
void
adduninvokemethod
(methoddefinition methoddefinition,
map?>
, integer> paratypepool)
list
methodlist = dependencemethodpool.
get(klass)
; methodlist.
add(methoddefinition);}
}static
void
checkdependence
(class<
?> beanclass)
list
okmethodlist =
newarraylist
<
>()
;for
(methoddefinition md : mdlist)}if
(!okmethodlist.
isempty()
)}dependencemethodpool.
remove
(beanclass);}
static
void
invokedependencemethod()
}static string getundependence()
}return str.
tostring()
;}}
Spring 學習之 bean的前 後處理
在bean被建立以及裝配後,beanpostprocessor 介面為你提供了二次機會來修改這個bean。public inte ce beanpostprocessor public class fuddifier implements beanpostprocessor public objec...
spring 基本Bean裝配
在基於spring的應用中,應用元件在spring中是啟用的。容器可以建立元件,裝配和配置元件,以及管理它們的整個生 命週期。容器是spring 框架的核心,spring容器使用di管理所有組成應用系統的元件。spring容器提供多個spring 容器。spring容器提供了多種容器,並分為兩類。b...
spring 引用其他Bean
spring ioc 容器中定義的bean 可以相互引用,ioc 充當媒介的作用。比如建立乙個乙個word 類,將car,people 等作為他的屬性。public class world public car getcar public void setcar car car public peo...