|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
Bean定义继承
豆子定义可以包含大量配置信息,包括构造函数 参数、属性值以及容器特定的信息,例如初始化 方法、静态工厂方法名称等。婴儿豆定义 来自父定义的配置数据。子定义可以覆盖部分 或者根据需要添加其他变量。使用父豆和子豆定义可以节省很多 打字。实际上,这是一种模板化。
如果你与应用上下文程序界面,Child Bean
定义用ChildBean定义类。大多数用户无法正常工作
他们能站在这个层面。相反,它们在类中声明性地配置豆定义
例如:ClassPathXmlApplicationContext.当你使用基于XML的配置时
元数据,你可以通过使用父母属性
指定该属性的父豆值。以下示例展示了如何
具体方法:
<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 | 注意父母属性。 |
子豆定义使用父定义中的Beans,如果没有 是 但也可以覆盖。在后一种情况下,子Beans必须是 与父节点兼容(即必须接受父节点的属性值)。
子豆定义继承作用域、构造子参数值、属性值,以及
方法会覆盖父方法,并可选择添加新值。任何作用域,初始化
方法、销毁方法,或静态的你指定的工厂方法设置
覆盖相应的父设置。
其余设置总是取自子定义:取决于, 自动布线模式、依赖检查、单例和懒初始化。
前面的例子通过以下方式明确标记母豆定义为抽象的
这抽象属性。如果父定义没有明确指定类,则
标记母豆定义为抽象是必需的,如下示例
显示:
<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>
母豆不能单独实例化,因为它不完整,而它确实是
也明确标记为抽象.当定义为抽象是的
仅可作为纯模板豆定义使用,作为 的父定义
儿童定义。尝试使用这样的抽象单独看母豆,通过引用
作为另一个豆子的参考属性或做显式getBean()与
父豆 ID 返回错误。同样,容器内部preInstantiateSingletons()方法忽略豆子定义为
抽象。
应用上下文默认预实例化所有单例。因此,它
重要的是(至少对于单粒豆来说),如果你有一个(母)豆子定义
你打算只用作模板,这个定义指定了一个类,即
必须确保将抽象属性设置为true,否则应用程序
上下文实际上会(尝试)预实例化抽象豆。 |