Spring基础——Bean定义的继承(Bean配置中的parent属性)

Bean的继承

  • 当一个Bean中定义了很多配置信息,可以将一部分固定信息抽象成父Bean,子Bean从父Bean继承配置数据,并根据需要可以覆盖或添加其他数据,这样可以使开发变的更加高效。

父Bean的定义

  • 父Bean所定义的配置属性子Bean必须完全兼容,也就是说子Bean必须要包含父Bean所有的配置属性,在配置的类中,可以是通过继承的方式实现,也可以是在类里包含所有属性来实现。
  • 父Bean的定义类
public class ParentBean {
    private String name;
    private String password;

    public void setName(String name) {
        this.name = name;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "ParentBean{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getPassword() {
        return password;
    }
}
  • 子BeanA,通过继承的方式兼容父Bean所有属性
public class SonBeanA extends ParentBean {
    private int connectNum;
    private int timeout;
    private int poolMax;

    public void setConnectNum(int connectNum) {
        this.connectNum = connectNum;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public void setPoolMax(int poolMax) {
        this.poolMax = poolMax;
    }

    @Override
    public String toString() {
        return "SonBean{" +
                "name=" + getName() +
                ", password" + getPassword() +
                ", connectNum=" + connectNum +
                ", timeout=" + timeout +
                ", poolMax=" + poolMax +
                '}';
    }
}
  • 子BeanB,添加父Bean中所有的属性来达成兼容
public class SonBeanB {
    //    private ParentBean parentBean;
    private String tools;

    private String password;

    @Override
    public String toString() {
        return "SonBeanB{" +
                "tools='" + tools + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String name;

    public void setName(String name) {
        this.name = name;
    }


    public void setTools(String tools) {
        this.tools = tools;
    }

}

XML配置parent属性继承父Bean

  • 父Bean并不一定是要指代抽象成父类,在由子类继承,可以直接通过parent属性来表示子Bean的定义继承
<!-- 父Bean定义 -->
<bean id="parentBean02" class="com.nobugnolife.bean.impl.ParentBean">
    <property name="name" value="redis"/>
    <property name="password" value="google"/>
</bean>


<!-- 子Bean通过parent继承父Bean的配置属性,并可以覆盖 -->
<bean id="sonBeanA02" class="com.nobugnolife.bean.impl.SonBeanA" parent="parentBean02">
    <property name="connectNum" value="20"/>
    <property name="timeout" value="100"/>
    <property name="poolMax" value="200"/>
    <!-- 覆盖父Bean的配置属性 -->
    <property name="name" value="mysql"/>
</bean>
  • 如果父Bean单纯只作为一个模板Bean来使用的话则可以将父Bean定位为抽象Bean(容器默认Bean为单例模式,因此在工厂创建的时候就会立即实例化Bean对象,而父Bean本身就不是一个完整的Bean,只是保留了部分数据的模板Bean,所以父Bean只能加载配置并不能直接实例化成对象。当定位为是一个abstract的Bean时,可以不提供class属性,并且ref和context中调用getBean方法均会报错。
  • 父Bean可以不需要明确的指定一个类,不过需要将父Bean定义为abstruct = true
<!-- 设置abstract为true后,容器将不会实例化Bean对象,但会保留配置属性 -->
<bean id="parentBean" abstract="true">
    <property name="name" value="msyql"/>
    <property name="password" value="123"/>
</bean>
  • 子Bean继承方式相同
<!-- 通过parent可以继承父bean的属性配置,同时也可以覆盖父bean的配置,子bean的类需要继承或包含父bean中所有的属性 -->
<bean id="sonBeanA" class="com.nobugnolife.bean.impl.SonBeanA" parent="parentBean">
    <property name="poolMax" value="100"/>
    <property name="timeout" value="1000"/>
    <property name="connectNum" value="30"/>
</bean>


<!-- spring提供的parent不只是可以通过继承,也可以是当前类所包含的属性,确保父Bean中有的属性,子Bean对应的类也有,注意是类,不是bean -->
<bean id="sonBeanB" class="com.nobugnolife.bean.impl.SonBeanB" parent="parentBean">
    <property name="tools" value="rock and stone"/>
    <!-- 同样也可以覆盖父bean中的属性,如果对应类而不是Bean是非继承关系的话,需要确保类中有相同的属性 -->
    <property name="name" value="MongoDB"/>
</bean>
  • 测试继承配置结果
@Test
public void testSonBean(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("parentBean.xml");
    SonBeanB sonBeanB = ctx.getBean("sonBeanB",SonBeanB.class);
    SonBeanA sonBeanA = ctx.getBean("sonBeanA",SonBeanA.class);
    SonBeanA sonBeanA02 = ctx.getBean("sonBeanA02",SonBeanA.class);
    System.out.println(sonBeanA);
    System.out.println(sonBeanB);
    System.out.println(sonBeanA02);
}
  • 输出结果

test_out


这里如果被定义为一个抽象Bean的话因为不需要关联class,所以完全可以理解为是单纯的对子Bean提前加载的BeanDefinition,可以不依托父类载体,而是直接从子类中提取的属性配置

  • 这边直接重新定义一个抽象parentBean,里面有Properties和int类型的uuid属性,并且只提供子Bean的定义类class。
public class ChildBean {
    private int uuid;

    private Properties props;

    public void setUuid(int uuid) {
        this.uuid = uuid;
    }

    @Override
    public String toString() {
        return "ChildBean{" +
                "uuid=" + uuid +
                ", props=" + props +
                '}';
    }

    public void setProps(Properties props) {
        this.props = props;
    }

}
<bean id="parentBean03" abstract="true">
    <property name="uuid" value="123"/>
    <property name="props">
        <props>
            <prop key="username">administrator</prop>
            <prop key="password">admin</prop>
        </props>
    </property>
</bean>
<bean id="childBean" class="com.nobugnolife.bean.impl.ChildBean" parent="parentBean03">
    <property name="props">
        <!-- 子集合重写密码并新增email配置 -->
        <props>
            <prop key="password">123</prop>
            <prop key="email">example@gmail.com</prop>
        </props>
    </property>
</bean>

test_child

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JWT的是什么

session共享 什么是session共享 Session共享是指在分布式系统中&#xff0c;在多个服务器之间共享同一个用户的会话数据。在传统的Web应用中&#xff0c;用户的会话信息通常存储在服务器端的Session中&#xff0c;而每个用户的请求在同一个服务器上处理&#xff0c;因此可以轻…

智奇科技工业 Linux 屏更新开机logo

智奇科技工业 Linux 屏更新开机logo 简介制作logo.img文件1、转换格式得到logo.bmp2、使用Linux命令生成img文件 制作rootfs.img文件替换rootfs.img中的logo 生成update.img固件附件 简介 智奇科技的 Linux 屏刷开机logo必须刷img镜像文件&#xff0c;比较复杂。 制作logo.i…

深度学习-Pytorch实现经典AlexNet网络:山高我为峰

深度学习-Pytorch实现经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰…

AI论文速读 | 大语言模型作为城市居民——利用LLM智能体框架生成人类移动轨迹

题目&#xff1a;Large Language Models as Urban Residents: An LLM Agent Framework for Personal Mobility Generation 作者&#xff1a;Jiawei Wang (王家伟), Renhe Jiang&#xff08;姜仁河&#xff09;, Chuang Yang&#xff08;杨闯&#xff09;, Zengqing Wu&#xf…

JeeSite Vue3:前端开发的未来之路

JeeSite Vue3&#xff1a;前端开发的未来之路 随着技术的飞速发展&#xff0c;前端开发技术日新月异。在这个背景下&#xff0c;JeeSite Vue3 作为一个基于 Vue3、Vite、Ant-Design-Vue、TypeScript 和 Vue Vben Admin 的前端框架&#xff0c;引起了广泛关注。它凭借其先进的技…

mapbox加载全球3D建筑

本案例使用Mapbox GL JavaScript库进行加载全球3D建筑。 文章目录 1. 引入 CDN 链接2. 创建地图3. 监听地图加载完成事件3.1. 获取地图的样式中的图层3.2. 查找图层3.3. 添加三维建筑图层 4. 演示效果5. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <script sr…

C++模拟揭秘刘谦魔术,领略数学的魅力

新的一年又开始了&#xff0c;大家新年好呀~。在这我想问大家一个问题&#xff0c;有没有同学看了联欢晚会上刘谦的魔术呢&#xff1f; 这个节目还挺有意思的&#xff0c;它最出彩的不是魔术本身&#xff0c;而是小尼老师“念错咒语”而导致他手里的排没有拼在一起&#xff0c;…

Android studio 侧边栏看不到 Commit 标签,不能方便的查看本地ChangaeList

参考 如上图&#xff0c;一次升级后找不到commit 标签&#xff0c;造成不能很好的监测本地修改了那些文件&#xff0c;通过搜索找到显示的方法。&#xff0c;进入设置找红框位置&#xff0c;勾选复选款即可。 正常显示

Python实现CCI工具判断信号:股票技术分析的工具系列(5)

Python实现CCI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;5&#xff09; 介绍算法解释 代码rolling函数介绍完整代码data代码CCI.py 介绍 在股票技术分析中&#xff0c;CCI (商品路径指标&#xff09;是一种常用的技术指标&#xff0c;用于衡量股价是否处于超…

JavaWeb Request:获取请求数据

Request是请求对象&#xff0c;Response是响应对象。 浏览器会发送HTTP请求到后台服务器[Tomcat]&#xff0c;请求中会包含很多请求数据 [请求行请求头请求体] &#xff0c;后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到Request对象&#xff0c;可以从Req…

Docker之数据卷

目录 一、什么是数据卷 二、自定义镜像 一、什么是数据卷 1.1Docker 数据管理 在生产环境中使用 Docker &#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行 数据共享&#xff0c;这必然涉及容器的数据管理操作 二、操作 将宿主机的目录与容器的…

双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025

D2025 为立体声音频功率放大集成电路&#xff0c;适用于各类袖珍或便携式立体声 收录机中作功率放放大器。 D2025 采用 DIP16 封装形式。 主要特点&#xff1a;  适用于立体声或 BTL 工作模式  外接元件少  通道分离性好  电源电压范围宽&#xff08;3V~12V &#xff…

深度学习GPU环境安装(WINDOWS安装NVIDIA)

1.检测是否支持GPU环境 1.1.打开设备管理器 winows下面搜索设备管理器&#xff08;或者从桌面"此电脑"——>右键点击——>"管理"打开&#xff09; 1.2.查看本地显卡 在"设备管理器"——"显示适配器"中&#xff0c;如果没有&…

瑞吉外卖项目详细分析笔记及所有功能补充代码

目录 项目刨析简介技术栈项目介绍项目源码 一.架构搭建1.初始化项目结构2.数据库表结构设计3.项目基本配置信息添加公共字段的自动填充全局异常处理类返回结果封装的实体类 二.管理端业务开发1.员工管理相关业务1.1员工登录1.2员工退出1.3过滤器拦截1.4员工信息修改1.5员工信息…

ElasticSearch之分片相关概念segment,merge,refresh等

写在前面 本文看下分片相关概念&#xff0c;segment&#xff0c;merge&#xff0c;refresh等。 1&#xff1a;segment&#xff0c;commit point&#xff0c;.del 一个倒排索引的文件称为segment&#xff0c;多个segment组合在一起就是lucene的index&#xff0c;也就是es的sh…

线程变量ThreadLocal用于解决多线程并发时访问共享变量的问题。

ThreadLocal介绍 ThreadLocal叫做线程变量&#xff0c;用于解决多线程并发时访问共享变量的问题。意思是ThreadLocal中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块&#xff0c;结构如下&#xff1a; http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

ssl证书无效是否继续访问啥意思

SSL证书&#xff08;Secure Sockets Layer&#xff09;是现代互联网通信安全的基础组成部分&#xff0c;尤其对于涉及敏感信息交换的HTTPS站点至关重要。当浏览器提示“SSL证书无效”时&#xff0c;这意味着浏览器无法验证网站的身份或确定其加密连接的安全性。这种情况下&…

基于Python+Flask实现一个TODO任务管理系统网站

随着科技的进步&#xff0c;数字化的任务清单逐渐成为生活中不可或缺的一部分。它们不仅可以帮助我们跟踪日常任务&#xff0c;还可以提高效率。但是&#xff0c;你是否考虑过自己制作一个任务管理系统呢&#xff1f; 好消息是&#xff0c;使用Python和Flask&#xff0c;我们可…

器件选型【MOS,三极管篇】

三极管篇&#xff1a; 三极管的两大作用&#xff1a;做开关使用和放大电流 一句话总结&#xff1a;三极管选型主要考虑集电极最大允许电流&#xff0c;集电极-发射极反向击穿电压&#xff0c;集电极最大允许耗散功率&#xff0c;特征频率&#xff0c;封装形式&#xff0c;工作…