【Spring】18 Bean 定义继承

文章目录

Spring 框架提供了一个强大的功能,称为 Bean 定义继承, 允许开发人员高效地在 bean 之间重用和自定义配置 。在本篇文章中我们将介绍 Bean 定义继承的概念,探讨它如何增强 Spring 应用程序的可维护性和可读性。

介绍

Spring 中的 Bean 定义封装了 bean 的配置信息,包括构造函数参数、属性值和容器特定的细节。通过 Bean 定义继承,子 bean 定义可以从父定义中继承配置数据,提供了一种方便的方式来应用模板并避免冗余配置。

声明式配置

当使用基于 XML 的配置元数据时,我们可以通过使用 parent 属性来指示子 bean 定义。以下是一个例子:

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"/>
    <!-- 年龄属性值将从父级继承 -->
</bean>

在这个例子中,inheritsWithDifferentClass 是一个从 inheritedTestBean 继承的子 bean。子 bean 可以覆盖或添加新的属性值,同时从父 bean 继承其他属性。

抽象Bean定义

当子 bean 定义仅用作模板时,通常将其标记为抽象。abstract="true" 属性表示父 bean 是不完整的,应该作为子定义的模板。

xml 复制代码
<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 定义从父级继承各种配置,包括作用域、构造函数参数、属性值和方法覆盖。子定义中的特定设置,如作用域或初始化方法,将覆盖相应的父设置。

注意:抽象Bean预实例化

当使用 ApplicationContext 时,默认情况下它会预先实例化所有单例。对于仅用作模板的抽象 bean,确保设置abstract="true" 以防止意外实例化。否则可能导致意外行为。

结论

总之,Spring 的 Bean 定义继承是一个有价值的工具,有助于促进代码重用,减少冗余,并提高应用程序的整体可维护性。通过有效应用父子关系,开发人员可以创建更模块化和有组织的配置结构。了解抽象 bean 和声明性配置的细微差别对于在 Spring 框架中充分利用此功能至关重要。

相关推荐
程序员黑豆3 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
GreenTea4 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年4 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅4 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
万少5 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
小席是个热心肠5 小时前
AI相关的自我学习
java·人工智能·学习
Java成神之路-7 小时前
Spring Cloud 微服务契约先行:为什么 Controller 建议要实现 Feign 接口?
spring·spring cloud·微服务
数智化管理手记7 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统8 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库