子 Bean 定義可繼承父 Bean 的配置屬性(構造參數、屬性值、初始化方法等),並可覆蓋或新增屬性。類似 Java 類繼承,但作用於配置元數據層面。
<bean id="helloWorld" class="com.yiibai.HelloWorld">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
</bean>
<bean id="helloIndia" class="com.yiibai.HelloIndia" parent="helloWorld">
<property name="message1" value="Hello India!"/> <!-- 覆蓋 -->
<property name="message3" value="Namaste India!"/> <!-- 新增 -->
</bean>
子 Bean helloIndia 自動繼承 message2,無需重複配置。
設置 abstract="true" 且不指定 class,純作為模板:
<bean id="beanTemplate" abstract="true">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
</bean>
<bean id="helloIndia" class="com.yiibai.HelloIndia" parent="beanTemplate">
<property name="message1" value="Hello India!"/>
</bean>
在 <property/> 或 <constructor-arg/> 內部直接定義 <bean/>,稱為內部 Bean。屬於外部 Bean 專屬,無需單獨 ID。
<bean id="textEditor" class="com.yiibai.TextEditor">
<property name="spellChecker">
<bean id="spellChecker" class="com.yiibai.SpellChecker"/>
</property>
</bean>
<bean id="outerBean" class="com.example.Outer">
<constructor-arg>
<bean class="com.example.Inner"/>
</constructor-arg>
</bean>
// TextEditor.java
public class TextEditor {
private SpellChecker spellChecker;
public void setSpellChecker(SpellChecker sc) { this.spellChecker = sc; }
public void spellCheck() { spellChecker.checkSpelling(); }
}
// SpellChecker.java
public class SpellChecker {
public SpellChecker() { System.out.println("Inside SpellChecker constructor."); }
public void checkSpelling() { System.out.println("Inside checkSpelling."); }
}
// beans.xml (內部 Bean)
<bean id="textEditor" class="com.yiibai.TextEditor">
<property name="spellChecker">
<bean class="com.yiibai.SpellChecker"/>
</property>
</bean>
輸出:
Inside SpellChecker constructor.
Inside setSpellChecker.
Inside checkSpelling.