聊聊spring之貫穿全局的重要對象BeanDefinition


BeanDefinition 在 spring 中貫穿始終,spring 要根據 BeanDefinition 對象來實
例化 bean,只要把解析的標簽,掃描的注解類封裝成 BeanDefinition 對象,spring
才能實例化 bean
beanDefinition 實現類
ChildBeanDefinition, GenericBeanDefinition, RootBeanDefinition
ChildBeanDefinition
ChildBeanDefinition 是一種 bean definition,它可以繼承它父類的設置,即
ChildBeanDefinition 對 RootBeanDefinition 有一定的依賴關系。
ChildBeanDefinition 從父類繼承構造參數值,屬性值並可以重寫父類的方法,同
時也可以增加新的屬性或者方法。(類同於 java 類的繼承關系)。若指定初始化方
法,銷毀方法或者靜態工廠方法,ChildBeanDefinition 將重寫相應父類的設置。
depends on,autowire mode,dependency check,sigleton,lazy init 一般由子類
自行設定
GenericBeanDefinition
注意:從 spring 2.5 開始,提供了一個更好的注冊 bean definition 類
GenericBeanDefinition,它支持動態定義父依賴,方法是
GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可
以有效的替代 ChildBeanDefinition 的絕大分部使用場合。GenericBeanDefinition 是一站式的標准 bean definition,除了具有指定類、可
選的構造參數值和屬性參數這些其它 bean definition 一樣的特性外,它還具有通
過 parenetName 屬性來靈活設置 parent bean definition。
通常, GenericBeanDefinition 用來注冊用戶可見的 bean definition(可見的
bean definition 意味着可以在該類 bean definition 上定義 post-processor 來對 bean
進行操作,甚至為配置 parent name 做擴展准備)。RootBeanDefinition /
ChildBeanDefinition 用來預定義具有 parent/child 關系的 bean definition。
RootBeanDefinition
一個 RootBeanDefinition 定義表明它是一個可合並的 bean definition:即在
spring beanFactory 運行期間,可以返回一個特定的 bean。RootBeanDefinition 可
以作為一個重要的通用的 bean definition 視圖。
RootBeanDefinition 用來在配置階段進行注冊 bean definition。然后,從 spring
2.5 后,編寫注冊 bean definition 有了更好的的方法:GenericBeanDefinition。
GenericBeanDefinition 支持動態定義父類依賴,而非硬編碼作為 root bean
definition。
GenericBeanDefinition 創建實例
 
BeanDefinition 中的屬性

 

(1)、id:Bean 的唯一標識名。它必須是合法的 XMLID,在整個 XML 文檔中唯一。
(2)、name:用來為 id 創建一個或多個別名。它可以是任意的字母符合。多個別名之間用逗號或空格分
開。
(3)、class:用來定義類的全限定名(包名+類名)。只有子類 Bean 不用定義該屬性。
(4)、parent:子類 Bean 定義它所引用它的父類 Bean。這時前面的 class 屬性失效。子類 Bean 會繼承
父類 Bean 的所有屬性,子類 Bean 也可以覆蓋父類 Bean 的屬性。注意:子類 Bean 和父類 Bean 是同一
個 Java 類。
(5)、abstract(默認為”false”):用來定義 Bean 是否為抽象 Bean。它表示這個 Bean 將不會被實
例化,一般用於父類 Bean,因為父類 Bean 主要是供子類 Bean 繼承使用。
(7)、lazy-init(默認為“default”):用來定義這個 Bean 是否實現懶初始化。如果為“true”,它將
在 BeanFactory 啟動時初始化所有的 SingletonBean。反之,如果為“false”,它只在 Bean 請求時才開
始創建 SingletonBean。
(8)、autowire(自動裝配,默認為“default”):它定義了 Bean 的自動裝載方式。
1、“no”:不使用自動裝配功能。2、“byName”:通過 Bean 的屬性名實現自動裝配。
3、“byType”:通過 Bean 的類型實現自動裝配。
4、“constructor”:類似於 byType,但它是用於構造函數的參數的自動組裝。
5、“autodetect”:通過 Bean 類的反省機制(introspection)決定是使用“constructor”
還是使用“byType”。
(10)、depends-on(依賴對象):這個 Bean 在初始化時依賴的對象,這個對象會在這個 Bean 初始
化之前創建。
(11)、init-method:用來定義 Bean 的初始化方法,它會在 Bean 組裝之后調用。它必須是一個無參數
的方法。
(12)、destroy-method:用來定義 Bean 的銷毀方法,它在 BeanFactory 關閉時調用。同樣,它也必
須是一個無參數的方法。它只能應用於 singletonBean。
(13)、factory-method:定義創建該 Bean 對象的工廠方法。它用於下面的“factory-bean”,表示
這個 Bean 是通過工廠方法創建。此時,“class”屬性失效。
(14)、factory-bean:定義創建該 Bean 對象的工廠類。如果使用了“factory-bean”則“class”屬性
失效。
(15)、autowire-candidate:采用 xml 格式配置 bean 時,將<bean/>元素的 autowire-candidate
屬性設置為 false,這樣容器在查找自動裝配對象時,將不考慮該 bean,即它不會被考慮作為其它 bean
自動裝配的候選者,但是該 bean 本身還是可以使用自動裝配來注入其它 bean 的。
(16)、MutablePropertyValues:用於封裝<property>標簽的信息,其實類里面就是有一個 list,list
里面是 PropertyValue 對象,PropertyValue 就是一個 name 和 value 屬性,用於封裝<property>標簽
的名稱和值信息
(17)、ConstructorArgumentValues:用於封裝<constructor-arg>標簽的信息,其實類里面就是有
一個 map,map 中用構造函數的參數順序作為 key,值作為 value 存儲到 map 中
(18)、MethodOverrides:用於封裝 lookup-method 和 replaced-method 標簽的信息,同樣的類里
面有一個 Set 對象添加 LookupOverride 對象和 ReplaceOverride 對象
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM