模擬Spring 處理帶Bean註解的有參方法

2021-10-04 22:32:44 字數 1883 閱讀 2419

繼前一篇博文。把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...