【Spring】18 Bean 定义继承

文章目录

      • 介绍
      • 声明式配置
      • 抽象Bean定义
      • 继承的配置项
      • 注意:抽象Bean预实例化
      • 结论

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

介绍

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

声明式配置

当使用基于 XML 的配置元数据时,我们可以通过使用 parent 属性来指示子 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>

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

抽象Bean定义

当子 bean 定义仅用作模板时,通常将其标记为抽象。abstract="true" 属性表示父 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 定义从父级继承各种配置,包括作用域、构造函数参数、属性值和方法覆盖。子定义中的特定设置,如作用域或初始化方法,将覆盖相应的父设置。

注意:抽象Bean预实例化

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

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM性能优化

运行时优化 方法内联 方法内联&#xff0c;是指 JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身 &#xff0c;从而消除调用成本&#xff0c;并为接下来进一步的代码性能优化提供基础&#xff0c;是JVM的一个重要优化手段之一。 注&#xff1a; C的inline属于编…

babylonsjs入门-基础模版

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 ​ 懒得打字&#xff0c;你们直接去copy组件吧&#xff0c;主要看这2…

旧版android模拟器,37岁程序员被裁

前言 从18年毕业至今&#xff0c;就职过两家公司&#xff0c;大大小小项目做了几个&#xff0c;非常感谢我的两位老大&#xff0c;在我的android成长路上给予我很多指导&#xff0c;亦师亦友的关系。 从年前至今参加面试了很多公司&#xff0c;也收到了几家巨头的offer&#…

transformer--编码器2(前馈全连接层、规范化层、子层链接结构、编码器层、编码器)

前馈全连接层 什么是前馈全连接层: 在Transformer中前馈全连接层就是具有两层线性层的全连接网络 前馈全连接层的作用: 考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力 code # 前馈全连接层 class PositionwiseFeedForward(nn.Module):de…

绝地求生:发现吃鸡号被盗,怎么操作才是最正确的

首先闲游盒先了解一下盗号者的盗号流程 一般盗号的流程是先把你steam上的皮肤饰品出售&#xff0c;然后把余额转走&#xff0c;再把steam账号作为黑号进行出售。 所以当闲游盒发现号被盗的时候也分为两种情况&#xff1a;一种是他正在出售商品的时候&#xff0c;你收到邮箱提示…

Linux命令行与shell脚本编程大全-3-4

第三部分高级shell脚本编程 第17章创建函数 17.1 脚本函数基础 17.1.1 创建函数 在bash shell 脚本中创建函数的语法有两种。第一种语法是使用关键字function&#xff0c;随后跟 上分配给该代码块的函数名&#xff1a; function name { commands } 17.1.2 使用函数 要在脚…

代码随想录算法训练营Day46 | 139.单词拆分、多重背包(卡码网56.携带矿石资源)

139.单词拆分 可以理解为一道 完全背包 排列 的题&#xff0c;dp数组定义和递推公式部分脑子需要转个弯 1、DP数组定义&#xff1a;一维滚动数组vector<bool>。dp[j]表示字符串s的[0, j]子串是否能够匹配。 2、DP数组初始化&#xff1a;dp[0]初始化为true&#xff0c;其…

Multi-Head Attention详解

文中大部分内容以及图片来自&#xff1a;https://medium.com/hunter-j-phillips/multi-head-attention-7924371d477a 当使用 multi-head attention 时&#xff0c;通常d_key d_value &#xff08;d_model / n_heads&#xff09;&#xff0c;其中n_heads是头的数量。研究人员称…

01-Vue2 介绍与指令的使用

1. Vue核心 1.1. Vue简介 1.1.1. 官网 中文官网Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)https://cn.vuejs.org/ 英文官网Vue.js - The Progressive JavaScript Framework | Vue.js (vuejs.org)https://vuejs.org/ 1.1.2. 介绍与描述 VUE是构建于用户界面的渐进…

靶机渗透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然后导入VM&#xff0c;并将网络连接改为NAT模式。首先我们…

UDP数据报套接字编程入门

目录 1.TCP和UDP的特点及区别 1.1TCP的特点 1.2UDP的特点 1.3区别 2.UDP Socket的api的介绍 2.1DatagramSocket API 2.2DatagramPacket API 3.回显客户端与服务器 3.1回显服务器 3.1.1UdpEchoServer类的创建 3.1.2服务器的运行方法start() 3.1.3main部分 3.1.4.完整…

C# CAD PaletteSet.Style各种外观和行为样式

ps.Style 是 Autodesk.AutoCAD.Windows.PaletteSet 类的一个属性&#xff0c;用于定义调色板集&#xff08;PaletteSet&#xff09;的各种外观和行为样式。它可以是 PaletteSetStyles 枚举类型的组合值 PaletteSetStyles 枚举中包含以下一些选项&#xff1a; NameEditable&am…

统计子矩阵

一、题目描述 P8783 [蓝桥杯 2022 省 B] 统计子矩阵 二、算法简析 2.1 二维前缀和 我们知道&#xff0c;只要确定了矩阵的左上顶点和右下顶点&#xff0c;一个矩阵就被固定了。因此&#xff0c;我们可以遍历这两个顶点&#xff0c;达到遍历所有子矩阵的目的&#xff0c;复杂…

AutoSAR(基础入门篇)12.5-Dem

目录 一、Dem简介 二、Dem消抖 1、计数模式 1. 普通增减计数 2. 反向归零增减模式

在微服务整合dubbo,以为微服务版的若依为例

在微服务整合dubbo&#xff0c;以为微服务版的若依为例 一、环境二、整合过程1、父模块依赖2、生产者3、消费者 三、修改若依的服务调用方式为dubbo1、改造系统模块2、改造认证授权中心 四、整合过程遇到的问题1、出现循环引用2、出现依赖冲突3、启动出现端口号被占用4、出现某…

UVa11726 Crime Scene

题目链接 UVa11726 - Crime Scene 题意 给定n&#xff08;n≤100&#xff09;个物体&#xff0c;每个物体都是一个圆或者k&#xff08;k≤10&#xff09;边形&#xff0c;用长度尽量小的绳子把它们包围起来。 分析 孟加拉国Manzurur Rahman Khan (Sidky)大神出的难题&#xff…

MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段

二阶段提交的 prepare 阶段&#xff0c;binlog 和 InnoDB 各自会有哪些动作&#xff1f; 本文基于 MySQL 8.0.32 源码&#xff0c;存储引擎为 InnoDB。 1. 二阶段提交 二阶段提交&#xff0c;顾名思义&#xff0c;包含两个阶段&#xff0c;它们是&#xff1a; prepare 阶段。…

springboot-基础-eclipse配置+helloword示例

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 下一篇&#xff1a;springboot-基础-添加model和controller的简单例子常用注解含义 目录 配置helloword示例新建项目创建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是…

BUUCTF AWD-Test1

打开靶场是这个有些简陋的界面。 随便点点&#xff0c;找到这个东西。 看到ThinkPHP&#xff0c;思路瞬间清晰&#xff0c;老熟人了。这个就是ThinkPHP漏洞。根据版本我们去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

SHELL 脚本: 导出NEO4j DUMP并上传SFTP

前提 开通sftp账号 安装expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安装目录 DUMP_PATH/data/dump # DUMP本地保存目录 DUMP_FILEneo4j_$(date %F).dump #导出文件名称 UPLOAD_DIR/path/to/stfp/dump/ #上传目录 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…