Spring 框架中的 Bean 继承:`parent` 属性 (XML配置)

👨‍👧‍👦 Spring 框架中的 Bean 继承:parent 属性 (XML配置)

在复杂的企业应用中,配置大量相似的组件(如数据访问对象 DAODAODAO、服务 ServiceServiceService)是常见的需求。这些组件往往需要共享相同的底层资源,例如数据库连接工厂或事务管理器。如果对每个组件都重复编写相同的配置,不仅工作量大,而且难以维护。

Spring 框架通过 Bean 定义继承 机制解决了这个问题,核心工具就是 Bean 定义中的 parent 属性。

1. parent 属性的核心原理

Spring Bean 的继承,是一种配置数据的继承 ,而非 Java 类层次结构的继承。它允许一个 Bean 定义(称为子 Bean )从另一个 Bean 定义(称为父 Bean)继承所有的配置信息。

  • 父 Bean (Parent Bean): 提供一个配置模板。它通常被标记为 抽象(abstract="true"),这意味着 Spring 容器不会尝试创建它的实例,它的唯一作用是作为配置蓝图。
  • 子 Bean (Child Bean): 通过设置 parent="父 Bean ID" 来继承配置。子 Bean 必须指定一个具体的 Java 类,Spring 容器会实例化它。

2. 为什么需要 Bean 继承?

最典型的应用场景是集中管理底层资源依赖。

例如,在一个使用 Hibernate 或 JPA 的系统中,所有的 DAODAODAO 组件都需要注入同一个 sessionFactory(会话工厂)。

🚫 不使用继承的问题:配置冗余

XML

复制代码
<bean id="orderDao" class="com.example.OrderDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="userDao" class="com.example.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
✅ 使用继承的解决方案:创建模板

使用 parent 属性后,配置变得简洁而强大:

步骤一:定义抽象父 Bean 作为模板

首先,定义一个抽象的 baseDaoTemplate,集中管理共享的依赖(如 sessionFactory)。

XML

复制代码
<bean id="baseDaoTemplate" abstract="true">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

步骤二:子 Bean 继承模板

具体的 DAODAODAO 组件通过 parent 属性继承这个模板。

XML

复制代码
<bean id="orderDao" 
      class="com.example.OrderDaoImpl"
      parent="baseDaoTemplate"> 
    
    <property name="modelName" value="Order" />
</bean>

<bean id="userDao" 
      class="com.example.UserDaoImpl"
      parent="baseDaoTemplate">
      
    <property name="modelName" value="User" />
</bean>

3. Bean 继承的操作细节

使用 parent 属性时,子 Bean 拥有极高的灵活性:

操作 描述 示例
继承 子 Bean 自动继承父 Bean 的所有配置(例如类名、属性值、构造函数参数等)。 orderDao 自动获得了 sessionFactory 属性的注入。
覆盖 子 Bean 可以定义与父 Bean 同名的属性,以覆盖父 Bean 的值。 如果 orderDao 想使用另一个 sessionFactoryNew,它可以重新定义 <property name="sessionFactory" ref="sessionFactoryNew" /> 来覆盖父 Bean 的配置。
添加 子 Bean 可以定义父 Bean 中没有的新属性,如上例中的 modelName。 orderDao 和 userDao 分别添加了各自的模型名称属性。

重要提示:

  • 子 Bean 总是使用自己的 Java 类定义。父 Bean 的 class 属性会被继承,但子 Bean 如果定义了自己的 class,则会覆盖父 Bean 的类。
  • 如果父 Bean 是抽象的(abstract="true"),则它不能被实例化,只能被继承。
相关推荐
时间静止不是简史4 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428047 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工10 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop10 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x10 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事11 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客11 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn18811 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn12 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc