## 4.7 Bean 定義的繼承
bean 的定義可以包含很多配置信息包括構造方法參數,屬性值和容器指定的信息,比 如初始化方法,靜態工廠方法名稱等。子 bean 定義繼承從父 bean 中獲得的配置元數據。 子 bean 可以覆蓋一些值或者添加其它所需要的。使用父子 bean 定義可以節省很多輸入。 實際上,這是一種模板形式。
如 果 你 編 程 式 地 使 用 ApplicationContext 接口,子 bean 的 定 義 可 以 由 ChildBeanDefinition 類代 表。 很多 用戶 不使 用這 個級 別的 方法 ,而 是在 類似于 ClassPathXmlApplicationContext.中聲明式地配置 bean 的信息。當使用基于 XML 的配置元數據時,你可以使用 parent 屬性來標識一個子 bean,使用這個屬性的值來標識 父 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"/>
<!-- age屬性值1將會從父bean中繼承過來 -->
</bean>
```
如果沒有指定一個子 bean 使用父 bean 的類,但也可以覆蓋它。在這種情形中,子 bean的類必須和父 bean 兼容,也就是說,它必須接受父 bean 的屬性值。
子 bean 的定義繼承構造方法參數值,屬性值,還有父 bean 的方法覆蓋,添加新值的 選擇。任何你指定的初始化方法,銷毀方法,和/或 static 工廠方法設置會覆蓋對應父 bean 中的設置。
剩下的設置通常是從子 bean 來定義:依賴,自動裝配模式,依賴檢測,單例,范圍, 延遲初始化。
前面的示例明確地使用了 abstract 屬性來標識了父 bean 的定義。如果父 bean 沒有 指定類,那么明確地標識父 bean 就必須要有 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屬性值1將會從父bean中繼承過來 -->
</bean>
```
父 bean 不會被實例化,因為它自己是不完整的,而且也明確地被 abstract 標記。當 bean 的定義是 abstract 這樣的,那么它也僅僅被用做純 bean 定義的模板,作為子 bean 定義的父 bean。嘗試使用這種自身是 abstract 的父 bean,作為另外一個 bean 參考的屬 性來指代它,或者使用父 bean 的 id 來明確使用 getBean()方法調用,會返回錯誤。相似 地,容器內部的 preInstantiateSingletons()方法忽略了抽象 bean 的定義。
> 
> 注意
> 默認情況下,預實例化所有單例 bean。因此,如果你有僅僅想用作模板的(父)bean, 而且這個 bean 指定了一個類,那么必須將 abstract 屬性設置為 true,這點是很重要的。否 則,應用上下文就會(嘗試)預實例化 abstract 的 bean。
- 第一部分 Spring framework 概述
- 第 1 章 Spring Framework 介紹
- 1.1 依賴注入和控制反轉
- 1.2 模塊
- 1.3 使用方案
- 第二部分 Spring 3 的新特性
- 第 2 章 Spring 3.0 的新特性和增強
- 2.1 Java 5
- 2.2 改進的文檔
- 2.3 新的文章和教程
- 2.4 新的模塊組織方式和系統構建方式
- 2.5 新特性概述
- 第 3 章 Spring 3.1 的新特性和增強
- 3.1 新特性概述
- 第三部分 核心技術
- 第 4 章 IoC 容器
- 4.1 Spring IoC 容器和 bean 的介紹
- 4.2 容器概述
- 4.3 Bean 概述
- 4.4 依賴
- 4.5 Bean 的范圍
- 4.6 自定義 bean 的性質
- 4.7 Bean 定義的繼承
- 4.8 容器擴展點
- 4.9 基于注解的容器配置
- 4.10 類路徑掃描和管理的組件
- 4.11 使用 JSR 330 標準注解
- 4.12 基于 Java 的容器配置