Spring学习(三)-Bean的作用域和生命周期

news2024/9/25 23:25:13

Spring学习(三)-Bean的作用域和生命周期

–2020年06月25日

一、bean的作用域

概念:

Spring 2.5之前的Bean 的作用域只有两种

  • Springleton:单例Bean

  • Prototype : 原型Bean

    Spring 2.5 之后Bean的作用域有一下五种

作用域描述
singleton (单例)使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。在整个spring ioc 容器中只能创建一个Bean实例
prototype (原型)使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。 每次调用都会创建一个bean
request (请求)该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
session (会话)该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
global-session (全局)该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

在Spring里面,默认情况下,bean是单实例对象

如何设置bean的作用域

  1. 在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例

  2. scope属性值

    • 默认值,singleton,表示单实例对象
    • prototype,表示多实例对象
    <bean id="book" class="com.ligangit.spring5.collectionType.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>
    
        @Test
        public void testCollection2(){
            ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
            Book book1 = context.getBean("book", Book.class);
    
            Book book2 = context.getBean("book", Book.class);
    //        book.test();
            System.out.println(book1);
            System.out.println(book2);
    
        }
    

    测试结果中两个Book对象的地址不相同,说明是两个不同的对象

    bean作用域

  3. singleton和prototype的区别

    • 第一:singleton是单实例,prototype是多实例

    • 第二:设置scope值是singleton时候,加载Spring配置文件时就会创建单实例对象;设置scope值是prototype时候,不是在加载Spring配置文件时就会创建对象,在调用getBean方法的时候创建多实例对象。

      singleton是在执行如下代码的时候,就会创建单实例对象;

      ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
      

      prototype是在执行如下代码的时候,才会创建多实例对象,每次创建的都是新的对象。

      Book book1 = context.getBean("book", Book.class);
      
  4. scope值是request的时候,创建的对象会放入带request中;scope值是session的时候,创建的对象会放入带session中。

二、bean的生命周期

bean的生命周期

  1. 通过构造器创建bean实例(无参构造)
  2. 为bean的属性设置值和对其他bean引用(调用set方法)
  3. 调用bean的初始化的方法(需要进行配置初始化的方法)
  4. bean可以使用了(对象获取到了)
  5. 当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)

演示bean的生命周期

  1. 实例类

    public class Orders {
        //无参构造
        public Orders(){
            System.out.println("第一步 执行无参构造创建bean示例");
        }
        private String oname;
        public void setOname(String oname) {
            this.oname = oname;
            System.out.println("第二步 调用set方法设置属性值");
        }
        //创建执行的初始化的方法
        public void initMethod(){
            System.out.println("第三步 执行初始化的方法");
        }
        //创建执行的销毁的方法
        public void destroyMethod(){
            System.out.println("第五步 执行销毁的方法");
        }
    }
    
  2. Spring配置文件配置

    <bean id="orders" class="com.ligangit.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手机"></property>
    </bean>
    
  3. 测试代码

    @Test
    public void testBean4(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步 获取创建bean实例对象");
        System.out.println(orders);
        //手动让bean实例销毁
        ((ClassPathXmlApplicationContext) context).close();
    }
    
  4. 测试结果

    bean作用域

加上bean的后置处理器后,生命周期有七步

  1. 通过构造器创建bean实例(无参构造)
  2. 为bean的属性设置值和对其他bean引用(调用set方法)
  3. 把bean的实例传递给bean后置处理器的方法postProcessBeforeInitialization
  4. 调用bean的初始化的方法(需要进行配置初始化的方法)
  5. 把bean的实例传递给bean后置处理器的方法postProcessAfterInitialization
  6. bean可以使用了(对象获取到了)
  7. 当容器关闭时候,调用bean的销毁方法(需要进行配置销毁的方法)

演示添加后置处理器效果

  1. 创建类,实现接口BeanPostProcessor,创建后置处理器

    public class MyBeanPost implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("在初始化之前执行的方法");
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("在初始化之后执行的方法");
            return bean;
        }
    }
    
  2. 在Spring配置文件中配置后置处理器

    配置后置处理器后,会给此配置文件中所有的bean实例添加后置处理器

    <bean id="orders" class="com.ligangit.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oname" value="手机"></property>
    </bean>
       
    <!--配置后置处理器(会给此配置文件中所有的bean实例添加后置处理器)-->
    <bean id="myBeanPost" class="com.ligangit.spring5.bean.MyBeanPost"></bean>
    
  3. 继续之前的生命周期测试代码,得到结果

    bean作用域

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

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

相关文章

C语言 Unix 时间戳 和 时间日期相互转换

Unix 时间戳&#xff08;也称为 POSIX 时间戳&#xff09;是一个表示从 1970 年 1 月 1 日 UTC 时刻开始所经过的秒数的数值。这个时间戳是与时间区域无关的&#xff0c;也就是说它在全球任何地方都表示同一个时刻。 如果你要将 Unix 时间戳转换为某个特定时区的时间&#xff…

封闭式蓝牙耳机推荐?4款更实用的开放式耳机推荐

封闭式耳机我想应该是头戴式耳机中的一种耳机类型吧&#xff0c;而开放式耳机则是一种范围比较大的耳机类型&#xff0c;这两种耳机类型确实有比较大的区别&#xff1a; 声音泄漏与隔音效果&#xff1a; 开放式耳机&#xff1a;由于其设计允许空气流通&#xff0c;因此声音会…

调用DXGI截图初始化失败,提示0xf 887a0004

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

09.FreeRTOS时间片调度与任务相关函数

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…

盲盒卡牌风靡市场,抽卡机小程序成为新的机遇

如今&#xff0c;在商场中都可以看到卡牌的身影&#xff0c;拆卡成为了当下年轻人休闲娱乐的新宠&#xff0c;卡牌市场逐渐升温。抽卡机小程序作为一个能够快速拆卡的新模式&#xff0c;已经逐渐成为了用户拆卡的重要渠道&#xff0c;也为卡牌市场的发展提供了重要方式。本文将…

数字化转型如何通过数据改变企业的运营流程?

不仅仅是技术层面的革新&#xff0c;更是企业运营理念、组织架构、文化氛围及市场策略的全面升级。数字化转型通过深度融合云计算、大数据、人工智能、物联网等前沿技术&#xff0c;优化企业运营流程&#xff0c;提升效率&#xff0c;增强竞争力&#xff0c;从而在快速变化的市…

RTOS(8)信号量和互斥量

1.信号量 信号量分为二值信号量和计数信号量 与队列相比&#xff1a;他不能传输数据&#xff0c;但同时他不需要传输数据&#xff0c;占用的空间也更小&#xff0c;运行更快&#xff1b; 2.互斥量 与二值信号量类似&#xff0c;是特殊的信号量&#xff0c;本身是想实现谁上锁…

【Harmony Next】在鸿蒙项目中一键添加卡片

【Harmony Next】在鸿蒙项目中一键添加卡片 1.下载鸿蒙编译器DevEco Studio的插件DevEco CodeGenie【下载链接】 在华为的编译器现在官网下面可以下载DevEco CodeGenie的压缩包&#xff0c;安装后可以使用DevEco CodeGenie进行智能问答、生成卡片、知识查询等操作 2.安装DevE…

MapStruct实体映射工具

一丶MapStruct是什么 MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现,生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。 官方网站 MapStruct – Java bean mappings, the easy way! 二丶为什么需要MapStru…

桌管系统能否查微信聊天记录?这篇文章告诉你答案

桌面管理系统&#xff08;简称“桌管系统”&#xff09;确实可以用来监控和查看员工的微信聊天记录。以“安企神”这款桌管系统为例&#xff0c;它提供了全面的功能来帮助企业管理和监控员工的上网行为及通信记录。以下是关于安企神系统如何查看微信聊天记录的一些具体信息&…

什么是行为监控?企业透明化管理新纪元!揭秘四款顶尖行为监控软件!

行为监控&#xff0c;是指通过技术手段对员工在工作场所内的行为、活动以及数据使用情况进行全面、实时的监测与分析。它不仅帮助管理者洞悉员工工作状态&#xff0c;提升团队效率&#xff0c;还能有效防止数据泄露和不当行为&#xff0c;为企业构建更加安全、有序的工作环境。…

RAG前沿技术/解决方案梳理

RAG前沿技术/解决方案梳理 BenchmarkRetrievalAdaptive-RAGDR-RAGRichRAGGenRT Critique/ReasoningSelf-RAGCorrective RAGSpeculative RAGPlanRAGSelf-ReasoningReSP MemorySelfmemHippoRAG Query RewriteRaFe SummaryRefiner 个人理解 对当前RAG的学术研究&#xff08;或者好…

加密的PDF文件怎么能够转换为word文档

Word是一种常见的文档格式&#xff0c;被广泛应用于办公室、教育等领域&#xff0c;目前它拥有较为丰富的文档编辑和格式化功能。然而&#xff0c;因为当前很多场景下&#xff0c;大多数资料文件都是以PDF格式存在&#xff0c;因为其具备比较强的稳定性&#xff0c;所以想要去修…

LearnOpenGL-光照章节学习笔记

LearnOpenGL-光照章节学习笔记 颜色创建一个光照场景 基础光照一、环境光照二、漫反射光照三、镜面反射 材质光照贴图一、漫反射贴图二、镜面光贴图三、放射光贴图 投光物一、平行光二、点光源衰减实现 三、聚光灯平滑边缘 多光源一、平行光&#xff08;定向光&#xff09;二、…

知识分享 | 详解整车区域控制器(ZCU)

随着智能网联汽车技术的迅猛发展&#xff0c;整车区域控制器ZCU&#xff08;Zone Control Unit&#xff09;作为汽车电子电气架构中的核心组件&#xff0c;其重要性日益凸显。ZCU不仅作为区域数据中心、IO中心及配电中心&#xff0c;在车辆动力、传感器管理、信息娱乐等方面发挥…

线性DP+摆渡车

线性DP&#xff1a; 具有线性“阶段”划分的动态规划算法称为线性DP。 线性DP无论状态表示是一维还是多维&#xff0c;DP算法在线性DP问题上都体现出了“作用在线性空间上的阶段划分和状态转移” &#xff0c;DP的阶段沿着各个维度线性增长。从一个或多个“初始状态”开始有方…

uni-app下Worker的使用

1、在static目录下创建一个目录用于存放worker文件 为啥要在static目录下创建worker目录呢&#xff1f;那是因为worker.js没办法在别的js中被引用&#xff0c;uni-app项目编译成微信小程序代码时会进行Tree-shaking&#xff08;摇树优化&#xff09;&#xff0c;把那些没被引用…

全方位教程:接入视频美颜SDK与直播美颜插件的完整步骤

今天&#xff0c;小编将为您详细介绍如何接入视频美颜SDK与直播美颜插件的完整步骤。 一、准备工作 开发环境的搭建 在开始集成之前&#xff0c;确保您的开发环境已配置完毕。无论是使用iOS、Android&#xff0c;还是Web开发&#xff0c;您都需要准备好对应的开发工具链&…

人工智能深度学习系列—深入探索KL散度:度量概率分布差异的关键工具

人工智能深度学习系列—深度解析&#xff1a;交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;在分类问题中的应用 人工智能深度学习系列—深入解析&#xff1a;均方误差损失&#xff08;MSE Loss&#xff09;在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…

你的报表工具选对了吗?中国式报表的正确制作方法

1. 中国式报表的困境 在许多企业中&#xff0c;“中国式报表”是一个让人头疼的存在。中国式报表通常格式复杂&#xff0c;包含大量数据和多层次的数据结构。它不仅需要展示大量的统计数据&#xff0c;还要通过交叉计算等方式呈现数据之间的关系。这种报表对数据处理能力、展示…