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...