写在之前
最近没事在浏览Spring官网,简单写一些相关的笔记,并不包所有技术点,信息来自Spring5.2.3
Spring中的Bean继承与Java中的继承不同, Spring中Bean的继承是实例之间的关系,因此主要表现为参数值的延续;而Java中的继承是类之间的关系,主要表现为方法、属性的延续
1. Spring Bean的继承
Bean定义可以包含许多配置信息,包括构造函数参数、属性值和容器特定信息,例如初始化方法、静态工厂方法名称等。子Bean定义从父定义继承配置数据。子定义可以根据需要覆盖某些值或添加其他值。使用父Bean和子Bean定义可以节省大量输入。这是一种模板形式
例如:
<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"/>
</bean>
上面的示例配置,parent="inheritedTestBean" 表示inheritsWithDifferentClass 继承BeaninheritedTestBean . 这个配置中子Bean会继承父Bean的age属性且值为1而dependon、autowire模式、依赖项检查、singleton和lazy init 取自子Bean
前面的示例使用abstract属性显式地将父bean定义标记为abstract。如果父定义没有指定类,则需要显式地将父bean定义标记为抽象
例如:
<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"/>
</bean>
上面的示例配置,父bean没有对应的类, 所以父bean不能单独实例化,因为它是不完整的,所以它也被显式标记为抽象的。当定义是抽象的时,它只能作为纯模板bean定义使用
2. Spring的Bean继承和Java继承区别
- Sping中的子Bean和父Bean可以是不同类型,但Java中的继承则可保证子类是一种特殊的父类。
- Spring中Bean的继承是实例之间的关系,因此主要表现为参数值的延续;而Java中的继承是类之间的关系,主要表现为方法、属性的延续。
- Spring中子Bean不可作为父Bean使用,不具有多态性;Java中的子类实例完全可以当成父类实例使用。
摘自李刚老师的《轻量级Java EE企业应用实战(第3版)》