?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
在bean定義中包含了大量的配置信息,其中包括容器相關(guān)的信息(比如初始化方法、靜態(tài)工廠方法名等等)以及構(gòu)造器參數(shù)和屬性值。子bean定義就是從父bean定義繼承配置數(shù)據(jù)的bean定義。它可以覆蓋父bean的一些值,或者添加一些它需要的值。使用父/子bean定義的形式可以節(jié)省很多的輸入工作。實(shí)際上,這就是一種模板形式。
當(dāng)以編程的方式使用BeanFactory
時(shí),子bean定義用ChildBeanDefinition
類表示。大多數(shù)用戶從來不需要以這個(gè)方式使用它們,而是以類似XmlBeanFactory
中的聲明方式去配置bean定義。當(dāng)使用基于XML的配置元數(shù)據(jù)時(shí),給'parent'
屬性指定值,意味著子bean定義的聲明。
<bean id="inheritedTestBean" abstract="true" class="org.springframework.beans.TestBean"> <property name="name" value="parent"/> <property name="age" value="1"/> </bean> <bean id="inheritsWithDifferentClass" class="org.springframework.beans.DerivedTestBean" parent="inheritedTestBean" init-method="initialize"> <property name="name" value="override"/> <!-- the age property value of 1 will be inherited from parent --> </bean>
如果子bean定義沒有指定class屬性,它將使用父bean定義的class屬性,當(dāng)然也可以覆蓋它。在后面一種情況中,子bean的class屬性值必須同父bean兼容,也就是說它必須接受父bean的屬性值。
一個(gè)子bean定義可以從父bean繼承構(gòu)造器參數(shù)值、屬性值以及覆蓋父bean的方法,并且可以有選擇地增加新的值。如果指定了init-method,destroy-method和/或靜態(tài)
factory-method,它們就會覆蓋父bean相應(yīng)的設(shè)置。
剩余的設(shè)置將總是從子bean定義處得到:依賴、自動裝配模式、依賴檢查、singleton、作用域和延遲初始化。
注意在上面的例子中,我們使用abstract屬性顯式地將父bean定義標(biāo)記為抽象的。下面是個(gè)父bean定義并沒有指定class屬性的例子,其中父bean必須顯式地標(biāo)上abstract
:
<bean id="inheritedTestBeanWithoutClass" abstract="true">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBeanWithoutClass" init-method="initialize">
<property name="name" value="override"/>
<!-- age will inherit the value of 1
from the parent bean definition-->
</bean>
由于這樣的父bean是不完整的,而且還被顯式標(biāo)記為抽象的
,因而它無法得到自己的實(shí)例。抽象
bean定義可作為子bean定義的模板。若要嘗試單獨(dú)使用這樣的父bean(比如將它作為其他bean的ref屬性而引用,或者直接使用這個(gè)父bean的id作為參數(shù)調(diào)用getBean()
方法),將會導(dǎo)致錯(cuò)誤。同樣地,容器內(nèi)部的preInstantiateSingletons()
方法會完全忽略abstract的bean定義。
默認(rèn)情況下,ApplicationContext
(不是BeanFactory
)會預(yù)實(shí)例化所有singleton的bean。因此很重要的一點(diǎn)是:如果你只想把一個(gè)(父)bean定義當(dāng)作模板使用,而它又指定了class屬性,那么你就得將'abstract'屬性設(shè)置為'true',否則應(yīng)用上下文將會(試著)預(yù)實(shí)例化抽象
bean。