1. 程式人生 > >Spring 的bean定義 : BeanDefinition

Spring 的bean定義 : BeanDefinition

簡介

對於基於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 factorypost process階段可能會被修改。注意該屬性並不總是執行時被對應bean真正使用的類的名稱:比如,bean是通過某個類的靜態工廠方法生成的,這裡是該類的類名,再比如,bean
是通過一個工廠bean生成的,那這裡為空。
scope 作用域, singleton或者prototype。在bean的作用域尚未決定之前,該屬性為null
lazyInit 是否懶載入,僅適用於singleton bean。當一個singleton bean被指定lazyInitfalse時,它會在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,ChildBeanDefinitionGenericBeanDefinition。它們共同的基礎邏輯實現在抽象類AbstractBeanDefinition。這些類之間的層級關係如下:
在這裡插入圖片描述