spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

news2024/12/24 8:14:24

😀前言
本章是spring基于XML 配置bean系类中第5篇讲解spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

  • 🍑spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解
    • 🍊bean 配置信息重用(继承)
      • 🍓应用实例
      • 完成测试
    • 🍎bean 创建顺序
      • 🍓实例演示
      • 🍀 一个问题?
        • ● 问题说明
    • 🍉bean 对象的单例和多例
      • ● 说明
      • 🍓应用实例演示
        • 创建car.java
        • 配置beans.xml
      • 使用细节
    • 😄总结

在这里插入图片描述

🍑spring-bean配置信息重用(继承)和bean创建顺序是什么以及bean 对象的单例和多例讲解

🍊bean 配置信息重用(继承)

🍓应用实例

● 说明

在spring 的ioc 容器, 提供了一种继承的方式来实现bean 配置信息的重用

● 应用实例演示

  1. 配置beans.xml
  1. 配置Monster对象

  2. 但是这个对象的属性值和 id="monster10"对象属性一样

  3. parent=“monster10” 指定当前这个配置的对象的属性值从 id=monster10的对象来

 <!--配置Monster对象-->
    <bean id="monster10" class="com.spring.bean.Monster">
        <property name="monsterId" value="10"/>
        <property name="name" value="蜈蚣精"/>
        <property name="skill" value="蜇人"/>
    </bean>

    <!--
    解读
    1. 配置Monster对象
    2.但是这个对象的属性值和 id="monster10"对象属性一样
    3.parent="monster10" 指定当前这个配置的对象的属性值从 id=monster10的对象来
    -->
    <bean id="monster11"
          class="com.spring.bean.Monster"
          parent="monster10"/>
<!-- 当我们把某个bean设置为abstract="true" 这个bean只能被继承,而不能实例化了-->

    <bean id="monster12" class="com.wyxedu.spring.beans.Monster" abstract="true">
            <property name="monsterId" value="12"/>
            <property name="name" value="美女蛇"/>
            <property name="skill" value="吃人"/>
    </bean>
<!-- parent="monster12" 就是继承使用了monster12 的配置信息-->
<bean id="monster13" class="com.wyxedu.spring.beans.Monster"
parent="monster12"/>

完成测试

在 spring 的 ioc 容器, 提供了一种继承的方式来实现 bean 配置信息的重用

 //配置Bean通过继承
    @Test
    public void getBeanByExtends() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");

        Monster monster11 = ioc.getBean("monster11", Monster.class);
        System.out.println("monster11=" + monster11);

        Monster monster13 = ioc.getBean("monster13", Monster.class);
        System.out.println("monster13=" + monster13);


    }

🍎bean 创建顺序

🍓实例演示

● 说明

  1. 在spring 的ioc 容器, 默认是按照配置的顺序创建bean 对象
<bean id="student01" class="com.hspedu.bean.Student" />
<bean id="department01" class="com.hspedu.bean.Department" />

会先创建student01 这个bean 对象,然后创建department01 这个bean 对象
2. 如果这样配置

<bean id="student01" class="com.hspedu.bean.Student" depends-on="department01"/>
<bean id="department01" class="com.hspedu.bean.Department" />

会先创建department01 对象,再创建student01 对象

🍀 一个问题?

● 问题说明

先看下面的配置, 请问两个bean 创建的顺序是什么? 并分析执行流程

  1. 先创建id=memberDAOImpl
  2. 再创建id = memberServiceImpl
  3. 调用memberServiceImpl.setMemberDAO() 完成引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfWzFcf1-1690616200538)(…/…/…/Typora/%E5%9B%BE%E7%89%87/image-20230729153006233.png)]

先看下面的配置, 请问两个bean 创建的顺序是什么, 并分析执行流程

  1. 先创建id = memberServiceImpl
  2. 再创建id=memberDAOImpl
  3. 用memberServiceImpl.setMemberDAO() 完成引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29sXXZ4W-1690616200539)(…/…/…/Typora/%E5%9B%BE%E7%89%87/image-20230729153318048.png)]

🍉bean 对象的单例和多例

● 说明

在 spring 的 ioc 容器, 在默认是按照单例创建的,即配置一个 bean 对象后,ioc 容器只会
创建一个 bean 实例。

如果,我们希望 ioc 容器配置的某个 bean 对象,是以多个实例形式创建的则可以通过配置
scope=“prototype” 来指定

🍓应用实例演示

创建car.java

public class Car {
    private Integer id;
    private String name;
    private Integer price;

    public Car(Integer id, String name, Integer price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Car() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

配置beans.xml

  1. 在默认情况下 scope属性是 singleton

  2. 在ioc容器中, 只要有一个这个bean对象

  3. 当程序员执行getBean时, 返回的的是同一个对象

  4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope=“prototype”

  5. 如果bean的配置是 scope=“singleton” lazy-init=“true” 这时,ioc容器就不会提前创建该对象, 而是当执行getBean方法的时候,才会创建对象

 <!--配置Cat对象
        1. 在默认情况下 scope属性是 singleton
        2. 在ioc容器中, 只要有一个这个bean对象
        3. 当程序员执行getBean时, 返回的的是同一个对象
        4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope="prototype"
        5. 如果bean的配置是 scope="singleton" lazy-init="true" 这时,ioc容器就不会提前创建该对象
           , 而是当执行getBean方法的时候,才会创建对象


    -->
    <bean id="cat" class="com.spring.bean.Cat" scope="prototype" lazy-init="false">
        <property name="id" value="100"/>
        <property name="name" value="小花猫"/>
    </bean>

完成测试修改Spring5BeanTest.java, 增加测试方法.

 @Test
    public void testBeanScope() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");

        Cat cat = ioc.getBean("cat", Cat.class);
        Cat cat2 = ioc.getBean("cat", Cat.class);
        Cat cat3 = ioc.getBean("cat", Cat.class);
        System.out.println("cat=" + cat);
        System.out.println("cat2=" + cat2);
        System.out.println("cat3=" + cat3);

    }

使用细节

  1. 默认是单例 scope=singleton,

在启动容器时, 默认就会创建 , 并放入到 singletonObjects 集合

  1. 当 < bean scope=“prototype” >

设置为多实例机制后, 该 bean 是在 getBean()时才创建

  1. 如果是单例 scope=singleton,

同时希望在 getBean 时才创建 , 可以指定懒加载lazy init=“true” (注意默认是 false)

  1. 通常情况下,

lazy-init 就使用默认值 false , 在开发看来, 用空间换时间是值得的, 除非有特殊的要求.

  1. 如果 scope=“prototype”

这时你的 lazy-init 属性的值不管是 ture, 还是 false 都是在getBean 时候,才创建对象

😄总结

本篇详细的讲解了spring-bean配置信息重用(继承)的由来
和bean创建顺序是什么及问题思考
以及bean 对象的单例和多例讲解

spring基于XML 配置bean系类
第一篇–>怎么通过类型来获取 bean以及为什么可以通过构造器配置 bean

第二篇–> 怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象–ref和怎么去引用/注入内部 bean 对象

第三篇–> spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值

第四篇–>spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

Java-SPI机制详解

Java之SPI机制详解 1: SPI机制简介 SPI 全称是 Service Provider Interface&#xff0c;是一种 JDK 内置的动态加载实现扩展点的机制&#xff0c;通过 SPI 技术我们可以动态获取接口的实现类&#xff0c;不用自己来创建。这个不是什么特别的技术&#xff0c;只是 一种设计理念…

【MySQL】MVCC的实现原理

MVCC的实现原理 1.前期准备1.2.隐式字段1.3.undo log日志1.4.readView 2.MVCC的实现流程2.1.R C&#xff08;读已提交---隔离级别&#xff09;2.2.R R&#xff08;可重复读---隔离级别&#xff09; 3.面试题---->事务中的隔离性是如何保证的呢&#xff1f;(你解释一下MVCC) …

减少错误和重复工作:PDM系统的智能排错功能

减少错误和重复工作&#xff1a;PDM系统的智能排错功能 在产品开发和制造过程中&#xff0c;错误和重复工作常常是企业面临的挑战。这不仅浪费了宝贵的时间和资源&#xff0c;还可能导致产品质量下降和生产延误。PDM系统&#xff08;Product Data Management&#xff0c;产品数…

Jmeter阶梯式加压测试

熟悉阿里云性能测试PTS的都可以看到压测配置设置如下图&#xff0c;相比Jmeter简单的线程设置&#xff0c;要合理更直观。 但是我们会去研究&#xff0c;性能测试中&#xff0c;有时需要模拟一种实际生产中经常出现的情况&#xff0c; 即&#xff1a;从某个值开始不断增加压力…

【Linux】常用的基本指令

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

matplotlib绘制方波圆周分解动画

1 方波的圆周分解 在学习傅里叶变换的时候&#xff0c;有一个经典的示例是方波的分解。我们知道&#xff0c;方波可以分解为无数个正弦波的叠加。而正弦波&#xff0c;又可以看作是圆周运动在一条直线上的投影。当时为了理解这个事情&#xff0c;恐怕大家也花了不少时间。 学…

【MyBtis】各种查询功能

目录 【MyBtis】配置和映射 11.1 示例:实现表数据的增、删、改、查 1.创建工程mybatis_DML demo 2.创建数据库操作的工具类&#xff1a;DBOperatorMgr.java 3.创建映射接口 4.创建XML映射文件 5.测试 【MyBtis】配置和映射 MyBatis 的真正强大之外在于它的映射语句&#xf…

jest单元测试的代码覆盖率显示不出来

jest.config.js配置文件 const path require(path)// 添加 verbose: true, testURL: http://localhost/module.exports {verbose: true,testURL: http://localhost/,rootDir: path.resolve(__dirname, ../../),moduleFileExtensions: [js,json,vue],moduleNameMapper: {^/(…

Java基础篇_1.4——程序流程控制之选择结构if语句

程序流程控制 关于程序控制的关键字&#xff1a; 程序控制关键字breakdowhileforcontinueswitchcasedefaultreturninstanceofifelse 程序运行时的一个顺序&#xff0c;程序的结构分为&#xff1a;顺序结构、选择结构和循环结构。 顺序结构是指按照代码的书写顺序执行。选择结…

如何手动创建EFI引导分区?

EFI系统分区是数据存储设备上的分区&#xff0c;供遵循统一可扩展固件接口的计算机使用。当计算机启动时&#xff0c;UEFI固件加载存储在可扩展系统分区上的文件&#xff0c;以启动安装的操作系统和各种实用程序。在GPT磁盘上启动Windows时&#xff0c;必须有EFI系统分区。如果…

ClickHouse(九):Clickhouse表引擎 - Log系列表引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

SpringBoot引入MyBatisGenerator

1.引入插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration><!--generator配置文件所在位置--><configuratio…

【echartsjs】js实现图表数据 跟动态数据联合展示 三个案例,附带源码

序幕&#xff1a; 所展示示例使用到多个js库&#xff0c;例如&#xff1a;jquery、echarts、liMarquee等等&#xff0c;我是下载到了本地&#xff0c;其他小伙伴记得自己下载相关js库&#xff0c;或者引用线上库 推荐一个获取线上资源网站&#xff1a;BootCDN - Bootstrap 中文…

fastadmin 权限管理栏目关闭了怎么恢复

目前能解决的方法就是直接url敲出来菜单配置&#xff1a;Internet Speed Test | Fast.com 然后再把这个隐藏显示出来

抄写Linux源码(Day7:读闪客文章第二回 “自己给自己挪个地儿”)

闪客文章地址&#xff1a;https://mp.weixin.qq.com/s?__bizMzk0MjE3NDE0Ng&mid2247499274&idx1&sn23885b5b1344a1425f5a971d06ad2e7d&chksmc2c584a7f5b20db1b0a75ea896e7218a9f8bcd006e68f53693bab240b13f9e2fb0ec0c9b9a6a&cur_album_id2123743679373688…

jmeter中json提取器,获取多个值,并通过beanshell组成数组

jmeter中json提取器介绍 特别说明&#xff1a;**Compute concatenation var(suffix_ALL)&#x1f617;*如果找到许多结果&#xff0c;则插件将使用’ &#xff0c; 分隔符将它们连接起来&#xff0c;并将其存储在名为 _ALL的var中 json提取器调试 在查看结果树中选择JSON Pat…

python——案例9:判断字符串的长度

案例8&#xff1a;设定列表&#xff1a;listl[0,1,2,3,4,5],求列表之和total0 list1[0,1,2,3,4,5] #列表lis1for ele in range(0,len(list1)):totaltotallist1[ele] print("列表中元素之和&#xff1a;",total) #输出结果

既要增长又要人效,零售人准备好接受老板的灵魂拷问了吗

增长对于零售行业尤其中小规模的玩家来说重要性不言而喻&#xff0c;而支撑持续增长的引擎之一就是对日常运营数据能随时进行快速、合理的解读&#xff0c;从而在瞬息万变的市场环境和有限的时间窗口内&#xff0c;根据指标背后折射的问题及时调整市场投放和客户关系维护等策略…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

原来这就是数组

原来这就是数组 数组的基本概念为什么使用数组数组的概念数组的特点数组如何初始化1.动态初始化2.静态初始化 数组的使用访问数组元素代码演示 遍历数组的几种方式1.直接打印&#xff08;不可取&#xff09;2.for循环打印&#xff08;如果有判断条件推荐&#xff09;3.转化为St…