Spring原始碼之 Bean註解解析

2021-10-18 02:53:57 字數 3992 閱讀 6935

spring @bean是乙個方法級別的註解,用於產生乙個被spring ioc容器所管理的bean。通常情況下,@bean可以與@configuration和@component註解一起使用(@configuration和@component是方法級別的註解)。在預設情況下@bean註解所產生的bean是單例模式的,此外,@bean還可以與@scope,@lazy,@dependon和@primary註解一起使用。

@target()

@retention

(retentionpolicy.runtime)

@documented

public @inte***ce

bean

;//用於指定bean的名稱

@aliasfor

("value"

) string[

]name()

default

;@deprecated

autowire autowire()

default autowire.no;

//布林型別,用於限定當前的bean是否可以自動注入到其他bean中,預設是true

boolean

autowirecandidate()

default

true

;//在初始化bean例項時需要呼叫的方法名稱。預設沒有要呼叫的方法

//注意initmethod所指定的方法必須是不帶入參的方法,且該方法允許在執行時丟擲異常

string initmethod()

default"";

//在關閉應用上下文時要在bean中呼叫的方法名稱,預設不呼叫任何方法

string destroymethod()

default abstractbeandefinition.infer_method;

}

configurationclassparser#doprocessconfigurationclass

// process individual @bean methods

setbeanmethods =

retrievebeanmethodmetadata

(sourceclass)

;for

(methodmetadata methodmetadata : beanmethods)

// process default methods on inte***ces

//處理介面中有@bean註解的,邏輯差不多

processinte***ces

(configclass, sourceclass)

;

檢索@bean修飾的方法,把方法的metadata和類configclass封裝成beanmethod

加入到configurationclass中的beanmethods集合中,這裡的作用就是收集@bean

修飾的方法

要想進行例項化,那必須先轉換為beandefinition,我們已經把需要處理的@bean

都收集好了,接下裡就是對集合中的進行load操作

this

.reader.

loadbeandefinitions

(configclasses);.

..for(beanmethod beanmethod : configclass.

getbeanmethods()

)

這裡迴圈遍歷每個beanmethod,交給configurationclassbeandefinitionreader處理

//拿到@bean修飾的方法的類

configurationclass configclass = beanmethod.

getconfigurationclass()

;//方法的元資料

methodmetadata metadata = beanmethod.

getmetadata()

;//方法名

string methodname = metadata.

getmethodname()

;//拿到註解資訊

annotationattributes bean = annotationconfigutils.

attributesfor

(metadata, bean.

class);

assert.

state

(bean != null,

"no @bean annotation attributes");

// consider name and any aliases

list

names =

newarraylist

<

>

(arrays.

aslist

(bean.

getstringarray

("name"))

);string beanname =

(!names.

isempty()

? names.

remove(0

): methodname)

;// 註冊別名,@bean註解的name屬性的值

for(string alias : names)

//例項化乙個beandefinition

configurationclassbeandefinition beandef =

newconfigurationclassbeandefinition

(configclass, metadata)

;beandef.

setsource

(this

.sourceextractor.

extractsource

(metadata, configclass.

getresource()

));//@bean修飾的是靜態方法,設定beanclass和factorymethod的值

if(metadata.

isstatic()

)else

beandef.

setuniquefactorymethodname

(methodname);}

//如果@bean修飾的是非靜態方法,設定factorybean和factorymethod的值

else

//填充beandefinition的屬性(@lazy,@primary,@dependson,@role,@description)

annotationconfigutils.

processcommondefinitionannotations

(beandef, metadata)

;//設定initmethod

string initmethodname = bean.

getstring

("initmethod");

if(stringutils.

hastext

(initmethodname)

)//設定destroymethod

string destroymethodname = bean.

getstring

("destroymethod");

beandef.

setdestroymethodname

(destroymethodname);.

..//scope等屬性相關操作..

.//把beandefinition註冊到註冊器中beandefinitionregistry

this

.registry.

registerbeandefinition

(beanname, beandeftoregister)

;

spring原始碼之bean包

測試 如下 建立乙個teacher類 public class teacher public void setdescription string description 在包下建立乙個spring.xml 在 測試 suppresswarnings deprecation public class...

Spring原始碼解讀之bean注入依賴

在應用開發中 以應用開發人員的身份訪問設計元件時候,往往需要引用 或者呼叫其他組建的服務,這種依賴關係如果固定在元件設計中就會造成 依賴關係的僵化和維護難度的增加。在 spring 中通過ioc 容器把資源的獲取方 向反轉,讓 ioc容器住的管理這些依賴關係,將這些關係注入到元件中,那麼會讓這些依賴...

spring原始碼 bean之增強初始化 3

四 可能有人會問,為什麼沒有defaultlistablebeanfactory的相關屬性了呢,這個在原始碼的講解部分會細說。五 原始碼解析 1 增強性的bean容器初始化實現方式 public static void main string args 2 實現過程 bean ception bea...