spring 框架说明文档学习记录(3.5)

来源:互联网 发布:mysql结构化查询语言 编辑:程序博客网 时间:2024/05/16 19:22

Bean继承

一个bean定义会包含很多配置信息,构造函数、属性值、容器指定信息如初始化方法、静态工厂方法等。一个子bean定义可以从父bean继承配置数据,并且可以覆盖或添加某些值。使用继承能够节省大量工作量。

子bean可以通过ChildBeanDefinition类实现,但一般不使用,而是使用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">  <property name="name" value="override"/>  <!-- the age property value of 1 will be inherited from parent --></bean>
如果未指定,子bean使用父bean的class类,也可以覆盖它。子bean必须兼容父bean,即它必须能够接收父bean的属性值。

子bean从父bean继承scope、constructor参数值、property值和方法,同时可以选择添加新值。任何scope、初始化方法、析构方法、静态工厂方法等设置都可以覆盖父bean的设置。

下列配置会一直从子bean获取:depends on、autowire mode、dependency check、singleton、lazy init。

如果父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 will inherit the value of 1 from the parent bean definition--></bean>
该父bean因为没有类且标注为抽象,不能被实例化。同样的,容器的预初始化方法preInstantiateSingletons()忽略抽象bean的定义。