Spring Bean继承是XML配置复用机制,通过parent属性实现:父Bean设abstract="true"作模板,子Bean指定class并可覆盖或新增属性,要求属性setter兼容,非Java类继承。

Spring 中的 Bean 继承不是 Java 类继承,而是 XML 配置层面的复用机制,核心靠 parent 属性实现。它让子 Bean 复用父 Bean 的属性配置,避免重复书写,尤其适合多 Bean 共享相同依赖或初始化参数的场景。
parent 属性怎么用
在 XML 配置中,给子 <bean> 标签加上 parent="父BeanID" 即可继承。父 Bean 必须存在,且通常设为 abstract="true"(不实例化,仅作模板)。
- 父 Bean 可以不指定
class,只定义通用属性(如sessionFactory、dataSource、timeout等) - 子 Bean 必须指定
class,并可覆盖父 Bean 中的任意属性(同名 property 会覆盖) - 子 Bean 也能新增父 Bean 没有的属性,不会冲突
抽象父 Bean 是关键
真正起复用作用的是抽象父 Bean —— 它不创建实例,只提供配置骨架。比如 DAO 层统一注入 sessionFactory:
<bean id="baseDao" abstract="true"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="userDao" class="com.example.UserDaoImpl" parent="baseDao"> <property name="modelName" value="User"/> </bean> <bean id="orderDao" class="com.example.OrderDaoImpl" parent="baseDao"> <property name="modelName" value="Order"/> </bean>
这样,两个 DAO 不用各自写一遍 sessionFactory 注入,维护成本大幅降低。
立即学习“Java免费学习笔记(深入)”;
子 Bean 和父 Bean 的兼容性要求
Spring 要求子 Bean 的类必须能接收父 Bean 定义的所有属性(即:setter 方法或构造参数要匹配),否则启动报错。
- 如果父 Bean 有
name和password属性,子 Bean 类里就得有对应的setName()和setPassword() - 子 Bean 类可以是父 Bean 类的子类,也可以完全无关——只要属性兼容就行
- 父 Bean 若定义了
class,子 Bean 不写class就默认用父类;但更常见的是父 Bean 不写class,纯粹当模板
常见误用提醒
容易踩坑的地方:
- 把
parent当成 Java 继承,以为子类必须 extends 父类 —— 实际无关 - 试图用
getBean("父BeanID")获取抽象父 Bean —— 会抛出异常,因为它不被实例化 - 父 Bean 没加
abstract="true",又没指定class—— Spring 会尝试实例化,失败报错 - 子 Bean 的 property 名拼错,导致覆盖失败,仍用父 Bean 的值(静默生效,不易察觉)


















