此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

Bean 定义可以包含大量配置信息,包括构造函数 参数、属性值和特定于容器的信息,例如初始化 方法、静态工厂方法名称等。子 Bean 定义继承 父定义中的配置数据。子定义可以覆盖某些 值或根据需要添加其他值。使用父 Bean 和子 Bean 定义可以节省很多 的打字。实际上,这是一种模板形式。Spring中文文档

如果以编程方式使用接口,则子 Bean 定义由类表示。大多数用户不工作 与他们在这个层面上。相反,它们在类中以声明方式配置 Bean 定义 例如 .使用基于 XML 的配置时 metadata,您可以使用属性来指示子 Bean 定义, 将父 Bean 指定为此属性的值。以下示例演示如何 为此,请执行以下操作:ApplicationContextChildBeanDefinitionClassPathXmlApplicationContextparentSpring中文文档

<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 类必须是 与父级兼容(即,它必须接受父级的属性值)。Spring中文文档

子 Bean 定义继承作用域、构造函数参数值、属性值和 方法重写父项,并带有添加新值的选项。任何作用域,初始化 方法、销毁方法或工厂方法设置 覆盖相应的父设置。staticSpring中文文档

其余设置始终取自子定义:取决于、 AutoWire 模式、依赖关系检查、单例和延迟初始化。Spring中文文档

前面的示例使用 属性。如果父定义未指定类,则显式 将父 Bean 定义标记为必需,如以下示例所示 显示:abstractabstractSpring中文文档

<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 的 ref 属性,或使用 父 Bean ID 返回错误。同样,容器的内部方法忽略定义为 抽象。abstractabstractabstractgetBean()preInstantiateSingletons()Spring中文文档

ApplicationContext默认情况下,预实例化所有单例。因此,它是 重要的是(至少对于单例 Bean),如果您有一个(父)Bean 定义 您打算仅将其用作模板,并且此定义指定了一个类,您 必须确保将抽象属性设置为 true,否则应用程序 context 实际上会(尝试)预先实例化 bean。abstract
ApplicationContext默认情况下,预实例化所有单例。因此,它是 重要的是(至少对于单例 Bean),如果您有一个(父)Bean 定义 您打算仅将其用作模板,并且此定义指定了一个类,您 必须确保将抽象属性设置为 true,否则应用程序 context 实际上会(尝试)预先实例化 bean。abstract