Spring 的bean定義 : BeanDefinition
阿新 • • 發佈:2018-12-30
簡介
對於基於Spring
框架開發的一個應用系統,其中每一個bean
都來自於一個bean
定義:開發人員的某個bean
定義,框架自身的某個bean
定義,三方庫的某個bean
定義。這些概念上的bean
定義,通過Spring
介面BeanDefinition
被建模,並且在應用執行時都會以一個BeanDefinition
物件的形式被註冊到Spring IoC
容器中。所以說,bean
定義,或者說,BeanDefinition
介面,是整個Spring
容器的根本概念之一。
介面BeanDefinition
簡介
Spring
框架中的介面BeanDefinition
顧名思義,就是"bean
BeanDefinition
定義了一個bean
的如下屬性 :
屬性名稱 | 介紹 |
---|---|
parentName |
雙親bean 定義(parent bean definition )的名稱.如果沒有雙親bean定義,這裡為空 |
beanClassName |
bean 的類名,在bean factory 的post process 階段可能會被修改。注意該屬性並不總是執行時被對應bean 真正使用的類的名稱:比如,bean 是通過某個類的靜態工廠方法生成的,這裡是該類的類名,再比如,bean bean 生成的,那這裡為空。 |
scope |
作用域, singleton 或者prototype 。在bean 的作用域尚未決定之前,該屬性為null |
lazyInit |
是否懶載入,僅適用於singleton bean 。當一個singleton bean 被指定lazyInit 為false 時,它會在bean factory 啟動時執行singleton bean 初始化的階段被例項化。 |
dependsOn |
所依賴的bean 的名稱,如果有多個依賴的bean ,這裡需要都列出來。容器會保證這些被依賴的bean |
autowireCandidate |
該bean 是否作為自動繫結的候選,僅適用於基於型別的自動繫結。基於名稱的繫結不受此屬性影響。 |
primary |
當前bean 定義是否主bean 。當某個自動繫結遇到多個候選bean 時,primary 屬性為true 的會被使用。 |
factoryBeanName |
如果要使用factory bean 來建立bean ,這裡指定了相應的工廠bean 的類名稱 |
factoryMethodName |
工廠方法名稱。基於類靜態工廠方法的情況下,結合beanClassName 使用;基於工廠bean 的情況下,結合factoryBeanName 使用。如果bean 定義的constructorArgumentValues 有內容,工廠方法被呼叫時會使用該屬性。 |
constructorArgumentValues |
bean 建立時的建構函式引數 |
propertyValues |
新建的bean 需要設定的屬性值 |
initMethodName |
bean 的初始化方法 |
destroyMethodName |
bean 的析構方法 |
role |
bean 的角色:APPLICATION ,SUPPORT ,INFRASTRUCTURE 。提示框架該bean 的角色和重要程度。 |
description |
bean 的描述,human readable |
singleton |
作用域斷言,是否singleton |
prototype |
作用域斷言,是否prototype |
abstract |
是否抽象bean 定義,抽象bean 定義的目的不是用於例項化bean ,而是有其他目的。 |
resourceDescription |
資源描述文字,告知當前bean 定義的來源,一般用於錯誤時顯示上下文。 |
originatingBeanDefinition |
返回來源bean 定義(如果有的話)。通過該屬性,可以獲取被修飾的bean 定義。需要注意的是該屬性僅僅返回直接 來源bean 定義而不是返回最深處 的來源bean 定義。一個bean 定義的originatingBeanDefinition 屬性隱含了一個來源bean 定義鏈,通過迭代訪問該鏈,可以最終找到最終來自使用者的bean 定義。 |
上表中提到的bean
的角色,分別是:
APPLICATION
– 指出該bean
是應用程式的主要部分,通常對應使用者定義的bean
。SUPPORT
– 應用支援性質的bean
,在某些地方比較重要,但從整個應用的返回來看,還沒那麼重要。INFRASTRUCTURE
– 基礎設施bean
,僅僅用於框架內部工作,跟終端使用者無關。
介面BeanDefinition
實現類簡介
BeanDefinition
介面有一些實現類,並且這些實現類有一些共同的基礎邏輯。這些實現類主要是 : RootBeanDefinition
,ChildBeanDefinition
和GenericBeanDefinition
。它們共同的基礎邏輯實現在抽象類AbstractBeanDefinition
。這些類之間的層級關係如下: