(五)Spring之Bean的作用域

news2025/7/18 8:17:55

文章目录

  • 环境
  • 单例的(singleton)
  • 多例的(prototype)
  • 其它scope
    • 自定义scope

上一篇:(四)Spring对IoC的实现

环境

spring6里程碑版本的仓库
依赖:spring context依赖、junit依赖、log4j2依赖
log4j2.xml文件放到类路径下。

单例的(singleton)

Spring默认情况下是Bean是单例的,在Spring上下文初始化的时候实例化,每次调用getBean方法的时候,都返回那个单例的对象。我们可以测试一下:
创建SpringBean类,提供无参构造方法:

public class SpringBean {
    public SpringBean() {
        System.out.println("SpringBean构造方法执行了");
    }
}

创建spring-scope.xml配置:

<bean id="springBean" class="com.scope.bean.SpringBean" scope="myThreadScope"/>
 	@Test
    public void testBeanScope(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
        SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean);

        SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean2);

        SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean3);
    }

请添加图片描述
通过测试得知:Spring的IoC容器中,默认情况下,Bean对象是单例的。
怎么测试Spring上下文初始化的时候实例化呢?
我们可以把测试程序中getBean()所在行代码注释掉:

 	@Test
    public void testBeanScope(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
        /*SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean);

        SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean2);

        SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean3);*/
    }

再次执行:
请添加图片描述
通过测试得知,默认情况下,Bean对象的创建是在初始化Spring上下文的时候就完成的。

多例的(prototype)

如果想让Spring的Bean对象以多例的形式存在,将bean设置的scope属性为prototype(翻译为原型)的时候,bean是多例的。
scope属性的值默认为singleton,翻译为单例
在Spring上下文初始化的时候就不会实例化这个bean。
每次调用getBean方法的时候,都实例化一次bean的对象。

修改spring-scope.xml

<bean id="springBean" class="com.scope.bean.SpringBean" scope="prototype"/>

测试程序:
松开注释即可

	@Test
    public void testBeanScope(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
        SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean);

        SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean2);

        SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean3);
    }

请添加图片描述
把测试代码中的getBean()方法所在行代码注释掉:
请添加图片描述
在初始化Spring上下文的时候,并没有创建Bean对象。

其它scope

scope属性的值不止两个,它一共包括8个选项:

  • singleton:默认的,单例。
  • prototype:原型。每调用一次getBean()方法则获取一个新的Bean对象。或每次注入的时候都是新对象。
  • request:一个请求对应一个Bean。仅限于在WEB应用中使用。
  • session:一个会话对应一个Bean。仅限于在WEB应用中使用。

这两个值是在web项目应用的,需要引入web(例如springmvc)框架,才可以使用

  • global session:portlet应用中专用的。如果在Servlet的WEB应用中使用global
    session的话,和session一个效果。(portlet和servlet都是规范。servlet运行在servlet容器中,例如Tomcat。portlet运行在portlet容器中。)
  • application:一个应用对应一个Bean。仅限于在WEB应用中使用。
  • websocket:一个websocket生命周期对应一个Bean。仅限于在WEB应用中使用。
  • 自定义scope:很少使用。

自定义scope

接下来自定义一个Scope,线程级别的Scope,在同一个线程中,获取的Bean都是同一个。跨线程则是不同的对象:(以下内容作为了解)

第一步:自定义Scope。(实现Scope接口)
spring内置了线程范围的类:org.springframework.context.support.SimpleThreadScope,可以直接用。
注意:如果自己实现这个类的话就需要实现Scope接口

第二步:将自定义的Scope注册到Spring容器中。
spring-scope.xml文件进行修改:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="myThreadScope">
                    <bean class="org.springframework.context.support.SimpleThreadScope"/>
                </entry>
            </map>
        </property>
    </bean>

第三步:在对应bean中使用Scope。
spring-scope.xml文件对bean进行修改:

	<bean id="springBean" class="com.scope.bean.SpringBean" scope="myThreadScope"/>

测试程序:

    @Test
    public void testThread(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
        SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean);
        SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(springBean2);
        //启动一个新的线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
                System.out.println(springBean3);
                SpringBean springBean4 = applicationContext.getBean("springBean", SpringBean.class);
                System.out.println(springBean4);
            }
        }).start();
    }

请添加图片描述

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

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

相关文章

【单片机基础】单片机中断和定时

中断什么是中断&#xff1f;中断IE寄存器中断查询次序例程定时器/计数器实现定时的方法&#xff1f;定时计数的概念什么是单片机定时器/计数器&#xff1f;定时器/计数器内部结构定时器的相关寄存器51单片机定时器初值计算方法详解例程中断 什么是中断&#xff1f; 中断是为使…

VINS学习(二)IMU预积分原理与实现

VINS学习&#xff08;二&#xff09;IMU预积分原理与实现一、连续时间下的IMU积分二、连续时间下的IMU预积分三、离散时间下的IMU预积分1. 欧拉法2. 中值法四、连续时间下的IMU状态误差传递五、离散时间下的IMU状态误差传递六、预积分量关于零偏的雅克比七、VINS代码实践1.预积…

【文末福利】半导体封装率先国产化,400+封装厂商最新名单汇总

根据我国国民经济“九五”计划至“十四五”规划&#xff0c;可窥见多方政策都在积极支持我国集成电路的发展&#xff0c;近几年更是强调突破集成电路关键技术&#xff0c;集中力量发展集成电路。其中封测技术作为集成电路制造的后道工艺&#xff0c;在整个集成电路产业链中扮演…

熬夜整理的vue面试题

Vue-router 路由模式有几种 vue-router 有 3 种路由模式&#xff1a;hash、history、abstract&#xff0c;对应的源码如下所示 switch (mode) {case history:this.history new HTML5History(this, options.base)breakcase hash:this.history new HashHistory(this, options…

网络安全设备之防火墙技术详解

一、防火墙概述 1、网络防火墙简介 无论是大中型企业网络,还是小型家庭办公网络,对网络安全方面的要求一直保持上升趋势。微软公司的官方网站尚且难逃黑客的魔爪,普通的中小网络更是难以抵抗了。解决网络安全问题最常用的防护手段就是安装网络防火墙,对于大中型规模的企业…

css实现流星划过动画

背景 &#x1f44f;渐变伪元素实现流星&#xff0c;translateY实现划过动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现原理 translateY()&#xff1a; translateY() 在页面垂直移动元素。 translateY(ty) 对应 …

上海亚商投顾:沪指重返3100点

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大指数今日低开高走&#xff0c;沪指重返3100点上方&#xff0c;深成指、创业板指午后均涨超2%。半导体板块掀涨停…

Java并发编程学习13-任务取消(下)

任务取消&#xff08;下&#xff09; 《任务取消》由于篇幅较多&#xff0c;拆分了两篇来介绍各种实现取消和中断的机制&#xff0c;以及如何编写任务和服务&#xff0c;使它们能对取消请求做出响应。 1. 任务限时运行 我们知道许多任务可能永远也无法处理完成&#xff08;…

[go学习笔记.第十四章.协程和管道] 3.协程配合管道案例以及管道的注意事项和使用细节

案例一 请完成goroutine和channel协同工作的案例&#xff0c;具体要求&#xff1a; (1).开启一个writeData协程&#xff0c;向管道intChan中写入50个整数. (2).开启一个readData协程&#xff0c;从管道intChan中读取writeData写入的数据 (3).注意&#xff1a; writeData和readD…

阿里内部目前最完整“Spring全线笔记”,不止是全家桶,太完整了

前言 对于每一位Java开发人员来说&#xff0c;提起Spring定是不陌生的&#xff0c;实际上自Spring框架诞生以来&#xff0c;就备受开发者的青睐&#xff0c;基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等&#xff0…

【前端】Vue+Element UI案例:通用后台管理系统-项目总结

文章目录相关链接前言效果登录页首页管理员的首页xiaoxiao的首页用户管理总结项目搭建左侧&#xff1a;CommonAside上侧&#xff1a;CommonHeader和CommonTag首页&#xff1a;Home.vue用户管理&#xff1a;User.vue登录页&#xff1a;Login.vue总代码相关链接 参考视频&#x…

Spark 3.0 - 1.Spark 新特性简介与 WordCount Demo 实践

目录 一.引言 二.Spark 3.0 特性 1.Improving the Spark SQL engine [改进的SQL引擎] 1.1 Dynamic Partition Pruning [动态分区修剪] 1.2 ANSI SQL compliant [兼容 ANSI SQL] 1.3 Join hints [连接提示] 2.Enhancing the Python APIs: PySpark and Koalas [增强Python…

推荐国产神器Eolink!API优先,Eolink领先!

前言&#xff1a; 在我们后端开发者做项目的时候&#xff0c;避免不了与前端界面的交互&#xff0c;对于我来讲&#xff0c;在做项目的时候用到过postman&#xff0c;swagger做接口测试工作&#xff0c;在公司的时候公司主要用YApi可视化接口平台&#xff0c;最近使用了一个爆款…

Express

目录 Express介绍 测试最基本的服务器 Express基本使用 托管静态资源 2. 挂载路径前缀 nodemon 路由 模块化路由 2.注册使用路由模块 中间件的概念 ​编辑1.next函数的作用 2.app.use(全局中间件) 4.连续多个中间件 5.局部生效中间件 中间件的分类 1.应用级别…

自动驾驶入门:感知

目录 概念 感知方法 CNN 检测与分类 跟踪 分割 Apollo感知 感知设备分类 概念 我们人类天生就配备多种传感器&#xff0c;眼睛可以看到周围的环境&#xff0c;耳朵可以用来听&#xff0c;鼻子可以用来嗅&#xff0c;也有触觉传感器&#xff0c;甚至还有内部传感器&…

Android 性能优化

你会学到什么&#xff1f; 深入底层&#xff0c;全面建立性能优化知识体系&#xff1b; 高手思路&#xff0c;掌握大厂性能调优方法论&#xff1b; 三大模块&#xff0c;实战内存速度包体积优化&#xff1b; 玩转“黑科技”&#xff0c;轻松实现性能优化进阶。 作者介绍 赵…

现货黄金基本知识:黄金策略五大心法

我们经常看电视剧或小说&#xff0c;都会看到一些老套的情景&#xff0c;例如当某个人物死的时候&#xff0c;会讲毕生所学&#xff0c;或者是功夫、或者是知识&#xff0c;传到某一个人的手中。在现货黄金市场&#xff0c;也有累积了历代交易高手的“武功心法”&#xff0c;虽…

Bergsoft NextSuite (VCL) 不同的方式提供数据

Bergsoft NextSuite (VCL) 不同的方式提供数据 BergSoft NextSuite是一家强大的Delphi和CBuilder。NextGrid是一台易于使用的计算机&#xff0c;可以在设计时和设计时理解方法和技能。NextGrid有不止一个StringGrid和ListView美味的标准。NextDBGrid是基于著名NextGrid计算机的…

深入浅出PyTorch——基础知识

一、PyTorch的简介和安装 因为在学习pytorch之前就已经配置和安装好了相关的环境和软件&#xff0c;所以这里就不对第一章进行详细的总结&#xff0c;就简要总结一下&#xff1a; 1.1 pytorch的发展 去了Paper with code网站查看了现在pytorch的使用&#xff0c;远超tensor…

【机器学习】线性分类【下】经典线性分类算法

主要参考了B站UP主“shuhuai008”&#xff0c;包含自己的理解。 有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 由于字数限制&#xff0c;分成两篇博客。 【机器学习】线性分类【上】广义线性模型 【机器学习】线性分类【下】经典线性分类算法 3. 线…