全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 6 分钟 ✍️ juanwangdev

Bean的继承

Spring Bean继承指的是配置信息的继承,而非Java类的继承。子Bean可以继承父Bean的配置属性。

基本用法

定义父Bean

XML
<!-- 父Bean配置 -->
<bean id="parentBean" abstract="true" class="com.example.Service">
    <property name="prefix" value="APP"/>
    <property name="suffix" value="END"/>
</bean>

<!-- 子Bean继承父Bean配置 -->
<bean id="childBean" parent="parentBean">
    <property name="name" value="UserService"/>
</bean>

子Bean覆盖父Bean属性

XML
<bean id="childBean" parent="parentBean">
    <!-- 覆盖父Bean的prefix属性 -->
    <property name="prefix" value="CUSTOM"/>
    <!-- 新增属性 -->
    <property name="name" value="OrderService"/>
</bean>

抽象Bean

使用abstract="true"定义抽象Bean,不能被实例化。

XML
<!-- 抽象Bean,仅作为配置模板 -->
<bean id="serviceTemplate" abstract="true">
    <property name="timeout" value="30"/>
    <property name="retryCount" value="3"/>
</bean>

<!-- 继承抽象Bean -->
<bean id="userService" parent="serviceTemplate" class="com.example.UserService">
    <property name="name" value="UserService"/>
</bean>

注解方式

注解方式没有直接的继承概念,但可以通过@Configuration类复用配置。

Java
@Configuration
public class ServiceConfig {

    @Bean
    public ServiceConfig commonConfig() {
        ServiceConfig config = new ServiceConfig();
        config.setTimeout(30);
        config.setRetryCount(3);
        return config;
    }

    @Bean
    public UserService userService() {
        UserService service = new UserService();
        // 复用公共配置
        service.setTimeout(commonConfig().getTimeout());
        service.setRetryCount(commonConfig().getRetryCount());
        return service;
    }
}

父Bean指定class

父Bean可以指定class或不指定:

XML
<!-- 父Bean指定class -->
<bean id="parentService" abstract="true" class="com.example.BaseService">
    <property name="prefix" value="APP"/>
</bean>

<!-- 子Bean继承class和属性 -->
<bean id="childService" parent="parentService"/>

<!-- 子Bean覆盖class -->
<bean id="anotherService" parent="parentService" class="com.example.CustomService"/>

继承关系示例

XML
<!-- 通用数据源配置 -->
<bean id="dataSourceTemplate" abstract="true" class="com.zaxxer.hikari.HikariDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="maximumPoolSize" value="10"/>
    <property name="connectionTimeout" value="30000"/>
</bean>

<!-- 主数据源 -->
<bean id="primaryDataSource" parent="dataSourceTemplate">
    <property name="jdbcUrl" value="jdbc:mysql://primary:3306/db"/>
    <property name="username" value="root"/>
    <property name="password" value="root123"/>
</bean>

<!-- 从数据源 -->
<bean id="secondaryDataSource" parent="dataSourceTemplate">
    <property name="jdbcUrl" value="jdbc:mysql://secondary:3306/db"/>
    <property name="username" value="root"/>
    <property name="password" value="root456"/>
</bean>

Bean继承与Java继承的区别

特性Bean继承Java继承
继承内容配置属性类的属性和方法
是否要求类继承关系
父Bean实例化抽象Bean不会实例化父类可实例化
主要作用配置复用代码复用

要点总结

  1. Bean继承是配置信息的继承,不是Java类继承
  2. abstract="true"定义抽象Bean,仅作配置模板
  3. 子Bean使用parent属性指定父Bean
  4. 子Bean可覆盖父Bean的属性配置
  5. 常用于公共配置的复用,如数据源配置

📝 发现内容有误?点击此处直接编辑

← 上一篇 Bean的生命周期
下一篇 → 自动装配
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库