一个 bean 定义可以包含很多配置信息,包括构造函数 参数、属性值和特定于容器的信息,例如初始化 method、静态工厂方法名称等。子 Bean 定义继承 来自父定义的 configuration 数据。子定义可以覆盖一些 值或根据需要添加其他值。使用父 Bean 定义和子 Bean 定义可以节省很多 的打字。实际上,这是一种模板形式。
如果以编程方式使用接口,则子 Bean
定义由 class 表示。大多数用户不工作
与他们在这个层面上。相反,它们在类中以声明方式配置 bean 定义
例如 .使用基于 XML 的配置时
metadata,您可以使用属性
指定父 Bean 作为此属性的值。以下示例显示了如何操作
为此,请执行以下操作:ApplicationContext
ChildBeanDefinition
ClassPathXmlApplicationContext
parent
<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"> (1)
<property name="name" value="override"/>
<!-- the age property value of 1 will be inherited from parent -->
</bean>
1 | 请注意该属性。parent |
1 | 请注意该属性。parent |
子 Bean 定义使用父定义中的 Bean 类(如果没有 指定,但也可以覆盖它。在后一种情况下,子 Bean 类必须是 与 Parent 兼容(即,它必须接受 Parent的 Property 值)。
子 Bean 定义继承 scope、constructor argument 值、property 值和
method 覆盖父级,并可选择添加新值。任何范围、初始化
您指定的 method、destroy method 或 factory method 设置
覆盖相应的父设置。static
其余设置始终取自子定义:depends on, autowire 模式、依赖关系检查、Singleton 和 Lazy init。
前面的示例通过使用
属性。如果父定义未指定类,则显式
根据需要标记父 Bean 定义,如下例所示
显示:abstract
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 不能单独实例化,因为它不完整,并且是
也明确标记为 .当定义为 时,它是
只能用作纯模板 bean 定义,用作
子定义。尝试单独使用这样的父 Bean,通过引用
作为另一个 bean 的 ref 属性,或者使用
父 Bean ID 返回错误。同样,容器的内部方法会忽略定义为
抽象。abstract
abstract
abstract
getBean()
preInstantiateSingletons()
ApplicationContext 默认情况下,预实例化所有单例。因此,它是
重要的是(至少对于单例 bean),如果你有一个(父)bean 定义
它仅打算用作模板,并且此定义指定了一个类,则
必须确保将 abstract 属性设置为 true,否则应用程序
context 实际上将(尝试)预先实例化 bean。abstract |
ApplicationContext 默认情况下,预实例化所有单例。因此,它是
重要的是(至少对于单例 bean),如果你有一个(父)bean 定义
它仅打算用作模板,并且此定义指定了一个类,则
必须确保将 abstract 属性设置为 true,否则应用程序
context 实际上将(尝试)预先实例化 bean。abstract |