【Spring】Bean 的作用域

一、singleton

默认情况下,Spring 的 IoC 容器创建的 Bean 对象是单例的(单例模式)

默认情况下,Bean 对象的创建是在初始化 Spring 上下文的时候就完成的

package org.qiu.spring.bean;/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.spring.bean* @date 2022-11-09-11:27* @since 1.0*/
public class SpringBean {
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="springBean" class="org.qiu.spring.bean.SpringBean"/></beans>
@Test
public void testBeanScope(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");SpringBean springBean1 = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean1);SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean2);SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean3);
}

运行结果:  

 

二、prototype

如果想让 Spring 的 Bean 对象以多例的形式存在,可以在 bean 标签中指定 scope 属性的值为:prototype,这样 Spring 会在每一次执行 getBean() 方法的时候创建 Bean 对象,调用几次则创建几次  

<bean id="springBean" class="org.qiu.spring.bean.SpringBean" scope="prototype"/>
public class SpringBean {public SpringBean(){System.out.println("SpringBean 无参数构造方法执行了......");}
}

运行结果:  

这一次在初始化 Spring 上下文的时候,并没有创建 Bean 对象

没有指定 scope 属性时,默认是 singleton 单例的

 

三、其他 

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

  • singleton:默认的,单例

  • prototype:原型。每调用一次 getBean() 方法则获取一个新的 Bean 对象。或每次注入的时候都是新对象

  • request:一个请求对应一个 Bean。仅限于在 WEB 应用中使用

  • session:一个会话对应一个 Bean。仅限于在 WEB 应用中使用

  • 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,在同一个线程中,获取的 Bean 都是同一个,跨线程则是不同的对象:(以下内容作为了解)

当 scope 为 singleton 时,多个线程共享一个 Bean

<bean id="springBean" class="org.qiu.spring.bean.SpringBean" scope="singleton"/>
@Test
public void testThreadScope(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean);// 启动一个线程new Thread(new Runnable() {@Overridepublic void run() {SpringBean springBean1 = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean1);}}).start();
}

运行结果:  

 

  • 第一步:自定义 Scope(实现 Scope 接口)

Spring 内置了线程范围的类:org.springframework.context.support.SimpleThreadScope,可以直接用

  • 第二步:将自定义的 Scope 注册到 Spring 容器中

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"><property name="scopes"><map><entry key="myThread"><bean class="org.springframework.context.support.SimpleThreadScope"/></entry></map></property>
</bean>
  • 使用Scope

<bean id="springBean" class="org.qiu.spring.bean.SpringBean" scope="myThread"/>
  • 测试

@Test
public void testThreadScope(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");SpringBean springBean = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean);// 启动一个线程new Thread(new Runnable() {@Overridepublic void run() {SpringBean springBean1 = applicationContext.getBean("springBean", SpringBean.class);System.out.println(springBean1);}}).start();
}

运行结果:  

 

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

【c++基础】温度统计员

说明 炎热的夏日&#xff0c;KC非常的不爽。他宁可忍受北极的寒冷&#xff0c;也不愿忍受厦门的夏天。最近&#xff0c;他开始研究天气的变化。他希望用研究的结果预测未来的天气。 经历千辛万苦&#xff0c;他收集了连续N&#xff08;1<N<10000&#xff09;天的最高气温…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…

C# EventHandler<T> 示例

新建一个form程序&#xff0c;在调试窗口输出执行过程&#xff1b; 为了使用Debug.WriteLine&#xff0c;添加 using System.Diagnostics; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using S…

celery异步框架的使用

文章目录 celery的介绍celery的架构celery的快速使用celery 包结构celery 定时 异步 延迟任务django使用celery celery的介绍 celery是什么&#xff1f; -翻译过来是芹菜 -官网&#xff1a;https://docs.celeryq.dev/en/stable/ -吉祥物&#xff1a;芹菜 -分布式的异步任务框架…

MySQL数据库⑨_事务(四个属性+回滚提交+隔离级别+MVCC)

目录 1. 事务的概念和四个属性 2. 事务的支持版本 3. 事务的提交方式 4. 事务的相关演示 4.1 常规操作_回滚_提交 4.2 原子性_演示 4.3 持久性_演示 4.4 begin自动更改提交方式 4.5 单条SQL与事务的关系 5. 事务的隔离级别 5.1 四种隔离级别 5.2 查看与设置隔离级别…

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置

第一步&#xff1a;导入 import promptAction from ohos.promptAction 第二步&#xff1a;在build下方写入 pageTransition(){PageTransitionEnter({ duration: 1200 }).slide(SlideEffect.Right)PageTransitionExit({ delay: 100 }).translate({ x: 100.0, y: 100.0 }).opac…

Servlet验证技术

验证技术 验证是验证用户信息并确定该用户是否有权访问服务器资源的过程。用于验证用户信息的各种验证技术包括: 基本验证基于表单的验证摘要验证客户机整数验证1. 基本验证 网站可能包含两种类型的网站,即受保护和不受保护网页。默认情况下,所有用户都可以访问不受保护或者…

学习Python需要准备什么?BoBo仔为您指点明经~~~

前言 大家好&#xff01;我是bobo仔&#xff0c;欢迎来阅读我的文章。我的这篇文章是专门为Python新手筹备的&#xff0c;大家一定要好好阅读&#xff0c;做好每一步&#xff0c;完成每一节。 【注&#xff1a;部分内容为作者见解、发现&#xff0c;如有版权侵袭或是信息错误…

类与结构体(6)

我们上一起讲了这一期讲存储类和继承&#xff0c;这个难度很大的。 存储类 存储类主要规定了函数和变量的范围&#xff0c;在c中有这些存储类↓&#xff1a; ৹ auto&#xff08;自动判断函数是什么类型&#xff09; ৹ register (常用的变量和inline差不多&#xff0c;但应…

【Java程序设计】【C00253】基于Springboot的在线考试管理系统(有论文)

基于Springboot的在线考试管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线考试系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统登录&#xff0c;管理…

Java奠基】玩转字符串从基础到高级的操作技巧

目录 初识String StringBuilder StringJoiner 字符串原理 综合练习 初识String java.lang.String 类代表字符串&#xff0c;Java程序中的所有字符串文字(例如“abc”)都为此类的对象&#xff0c;例&#xff1a; String name "张三" 当使用双引号直接赋值时&…

基于物联网的实时数据分析(简单介绍)

在当今这个信息化、数字化飞速发展的时代&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;和实时数据分析成为了技术革新的两大支柱。对于刚入行的新手来说&#xff0c;理解这两个概念及其相互作用不仅是迈入这一领域的第一步&#xff0c;更是掌握未来技术趋…