对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

Bean定义继承

豆子定义可以包含大量配置信息,包括构造函数 参数、属性值以及容器特定的信息,例如初始化 方法、静态工厂方法名称等。婴儿豆定义 来自父定义的配置数据。子定义可以覆盖部分 或者根据需要添加其他变量。使用父豆和子豆定义可以节省很多 打字。实际上,这是一种模板化。spring-doc.cadn.net.cn

如果你与应用上下文程序界面,Child Bean 定义用ChildBean定义类。大多数用户无法正常工作 他们能站在这个层面。相反,它们在类中声明性地配置豆定义 例如:ClassPathXmlApplicationContext.当你使用基于XML的配置时 元数据,你可以通过使用父母属性 指定该属性的父豆值。以下示例展示了如何 具体方法:spring-doc.cadn.net.cn

<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必须是 与父节点兼容(即必须接受父节点的属性值)。spring-doc.cadn.net.cn

子豆定义继承作用域、构造子参数值、属性值,以及 方法会覆盖父方法,并可选择添加新值。任何作用域,初始化 方法、销毁方法,或静态的你指定的工厂方法设置 覆盖相应的父设置。spring-doc.cadn.net.cn

其余设置总是取自子定义:取决于, 自动布线模式、依赖检查、单例和懒初始化。spring-doc.cadn.net.cn

前面的例子通过以下方式明确标记母豆定义为抽象的 这抽象属性。如果父定义没有明确指定类,则 标记母豆定义为抽象是必需的,如下示例 显示:spring-doc.cadn.net.cn

<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()方法忽略豆子定义为 抽象。spring-doc.cadn.net.cn

应用上下文默认预实例化所有单例。因此,它 重要的是(至少对于单粒豆来说),如果你有一个(母)豆子定义 你打算只用作模板,这个定义指定了一个类,即 必须确保将抽象属性设置为true,否则应用程序 上下文实际上会(尝试)预实例化抽象豆。