在bean定義中包含了大量的配置資訊,其中包括容器相關的資訊(比如初始化方法、靜態工廠方法名等等)以及構造器引數和屬性值。子bean定義就是從父bean定義繼承配置資料的bean定義。它可以覆蓋父bean的一些值,或者新增一些它需要的值。使用父/子bean定義的形式可以節省很多的輸入工作。實際上,這就是一種模板形式。
當以程式設計的方式使用beanfactory
時,子bean定義用childbeandefinition
類表示。大多數使用者從來不需要以這個方式使用它們,而是以類似xmlbeanfactory
中的宣告方式去配置bean定義。當使用基於xml的配置元資料時,給'parent'
屬性指定值,意味著子bean定義的宣告。
如果子bean定義沒有指定class屬性,它將使用父bean定義的class屬性,當然也可以覆蓋它。在後面一種情況中,子bean的class屬性值必須同父bean相容,也就是說它必須接受父bean的屬性值。parent="inheritedtestbean"init-method="initialize">
乙個子bean定義可以從父bean繼承構造器引數值、屬性值以及覆蓋父bean的方法,並且可以有選擇地增加新的值。如果指定了init-method,destroy-method和/或靜態
factory-method,它們就會覆蓋父bean相應的設定。
剩餘的設定將總是從子bean定義處得到:依賴
、自動裝配模式
、依賴檢查
、singleton
、作用域
和延遲初始化
。注意在上面的例子中,我們使用abstract
屬性顯式地將父bean定義標記為抽象的。下面是個父bean定義並沒有指定class屬性的例子,其中父bean必須顯式地標上abstract
:
由於這樣的父bean是不完整的,而且還被顯式標記為
抽象的
,因而它無法得到自己的例項。抽象
bean定義可作為子bean定義的模板。若要嘗試單獨使用這樣的父bean(比如將它作為其他bean的ref屬性而引用,或者直接使用這個父bean的id作為引數呼叫getbean()
方法),將會導致錯誤。同樣地,容器內部的preinstantiatesingletons()
方法會完全忽略abstract的bean定義。
beanfactory
)會預例項化所有singleton的bean。因此很重要的一點是:如果你只想把乙個(父)bean定義當作模板使用,而它又指定了class屬性,那麼你就得將'abstract'
屬性設定為'true'
,否則應用上下文將會(試著)預例項化抽象
bean。
spring註解定義bean
1 利用註解宣告該類 component student id名為 student public class student2 配置掃瞄器 xmlns context 掃瞄某包 多個包用逗號分隔 執行流程 spring在啟動的時候,會根據base package在 該包中掃瞄所有類,查詢這些類是否有...
Spring中Bean的配置
以下面的xml檔案舉例 第乙個bean的名稱為role,第二個bean的名稱為medicine,第三個bean的名稱為spring.chapter.mary.poison,第四個bean的名稱為spring.chapter.mary.poison 1 id和name的區別如下 id屬性具有唯一性,每...
Spring中Bean的配置
可以把spring看做乙個大型的工廠,而spring容器中的bean就是該工廠的產品。要想使用這個工廠生產和管理bean,就需要在配置檔案中告訴它需要哪些bean,以及需要使用何種方式將這些bean裝配到一起。xml配置檔案的根元素是beans,beans中包含了多個bean子元素,每乙個bean子...