Bean 的作用域

Bean 的作用域种类

在 Spring 中⽀持 6 种作⽤域,后 4 种在 Spring MVC 环境才⽣效

        1. singleton:单例作⽤域

        2. prototype:原型作⽤域(多例作⽤域)

        3. request:请求作⽤域

        4. session:会话作⽤域

        5. application:全局作⽤域 

        6. websocket:HTTP WebSocket 作⽤域

作用域及其含义

参考文档:https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html

代码实现

// Bean 作用域的配置
@Configuration
public class BeanConfig {// Bean 的默认作用域,单例模式@Beanpublic User user(){return new User();}//作用域: singleton 单例模式//每个 Spring IoC 容器内同名称的 bean 只有⼀个实例(单例)(默认)@Bean@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public User singletonUser(){return new User();}//作用域:prototype 原型(非单例)//每次获取 bean 时会创建新的实例(⾮单例)@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public User prototypeUser(){return new User();}//作用域:request 请求//每个 HTTP 请求⽣命周期内,创建新的实例(web环境中)@Bean@RequestScopepublic User requestUser(){return new User();}//作用域:session 会话//每个 HTTP Session ⽣命周期内,创建新的实例(web环境中)@Bean@SessionScopepublic User sessionUser(){return new User();}//作用域:application 应用@Bean@ApplicationScopepublic User applicationUser(){return new User();}
}

        @RequestScope 等同于 @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)

        @SessionScope 等同于 @Scope(value =WebApplicationContext.SCOPE_SESSION, proxyMode =ScopedProxyMode.TARGET_CLASS)

        @ApplicationScope 等同于 @Scope(value =WebApplicationContext.SCOPE_APPLICATION, proxyMode =ScopedProxyMode.TARGET_CLASS)

        proxyMode⽤来为 spring bean 设置代理. proxyMode = ScopedProxyMode.TARGET_CLASS 表⽰这个 Bean 基于 CGLIB 实现动态代理.Request,session和 application 作⽤域的 Bean 需要设置 proxyMode

测试不同作用域的 Bean 取到的对象是否⼀样

@RestController
@RequestMapping("/Bean")
public class BeanController {//默认作用域下获取的对象@Qualifier("user")  //设置注入对象的名称@Autowiredprivate User defaultBean;//作用域为单例(singleton)时获取的对象@Qualifier("singletonUser")@Autowiredprivate User singletonBean;//作用域为原型(prototype)时获取的对象@Qualifier("prototypeUser")  //设置注入对象的名称@Autowiredprivate User prototypeBean;//作用域为 HTTP 请求(request)时获取的对象@Qualifier("requestUser")  //设置注入对象的名称@Autowiredprivate User requestBean;//作用域为会话(session)时获取的对象@Qualifier("sessionUser")  //设置注入对象的名称@Autowiredprivate User sessionBean;//作用域为 ServletContext⽣命周期内(application)时获取的对象@Qualifier("applicationUser")  //设置注入对象的名称@Autowiredprivate User applicationBean;//注入 Spring 的 IoC 容器,注意 applicationContext 导入的包是 springframework 的@Autowiredprivate ApplicationContext applicationContext;//默认作用域下获取的对象@RequestMapping("/default")public String defaultBean(){User contextBean=(User) applicationContext.getBean("user");return "默认作用域下,注入的对象为:"+defaultBean+"在 context 容器中获取的对象为:"+contextBean;}//作用域为单例(singleton)时获取的对象@RequestMapping("/singleton")public String singletonBean(){User contextBean=(User) applicationContext.getBean("singletonUser");return "单例(singleton)作用域下,注入的对象为:"+singletonBean+"在 context 容器中获取的对象为:"+contextBean;}//作用域为原型(prototype)时获取的对象@RequestMapping("/prototype")public String prototypeBean(){User contextBean=(User) applicationContext.getBean("prototypeUser");return "原型(prototype)作用域下,注入的对象为:"+prototypeBean+"在 context 容器中获取的对象为:"+contextBean;}//作用域为 HTTP 请求(request)时获取的对象@RequestMapping("/request")public String requestBean(){User contextBean=(User) applicationContext.getBean("requestUser");return "request 请求作用域下,注入的对象为:"+requestBean+"在 context 容器中获取的对象为:"+contextBean;}//作用域为会话(Session)时获取的对象@RequestMapping("/session")public String sessionBean(){User contextBean=(User) applicationContext.getBean("sessionUser");return "session 会话作用域下,注入的对象为:"+sessionBean+"在 context 容器中获取的对象为:"+contextBean;}//作用域为应用(application)时获取的对象@RequestMapping("/application")public String applicationBean(){User contextBean=(User) applicationContext.getBean("applicationUser");return "application 应用作用域下,注入的对象为:"+applicationBean+"在 context 容器中获取的对象为:"+contextBean;}
}

观察 Bean 的作用域

单例作用域(singleton)

        默认就是单例作用域,所以默认情况下和单例( singleton)作用域下,多次访问,得到的都是同⼀个对象,并且 @Autowired 和 applicationContext.getBean() 也是同⼀个对象.

原型作用域(prototype)

        每次获取的对象都不⼀样(注⼊的对象在 Spring 容器启动时,就已经注⼊了,所以多次请求也不会发⽣变化)

请求作⽤域(request)

        在⼀次请求中,@Autowired 和 applicationContext.getBean() 也是同⼀个对象. 但是每次请求,都会重新创建对象

会话作⽤域(session)

        在⼀个 session 中,多次请求,获取到的对象都是同⼀个.

        换⼀个浏览器访问,发现会重新创建对象.(另⼀个 Session )

应用作⽤域(application)

        在⼀个应⽤中,多次访问都是同⼀个对象

Application 和 singleton 的区别

         Application scope就是对于整个 web 容器来说,bean 的作⽤域是 ServletContext 级别的.这个和 singleton有点类似,区别在于: Application scope是 ServletContext 的单例, singleton 是⼀个 ApplicationContext 的单例.在⼀个 web 容器中 ApplicationContext 可以有多个.(了解即可)

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

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

相关文章

双重OSPF + OSPF综合实验

一、实验要求 1.R4为ISP,所连接的所有物理接口为公有网段,任意指定IP即可。 2.R1-2-3 构建一个星型结构的MGRE结构,其中R1为中心点,假设R1的公有IP为固定地址。 3.R1-5-6 构建另一个全连网状的MGRE网络,其中R1/5均为中…

postman请求404 解决方式

404报错原因: URL错误:请求的URL可能包含错误,或者不存在于服务器上。这可能是因为URL中的路径或参数拼写错误,或者请求的资源已被移除或重命名。 注意请求路径和参数名称是否一致 路由配置错误:在使用像Spring Boo…

【C语言期末】商品管理系统

本文资源:https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括:包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求:1、信息首先保存在文件中,然后打开文件进行…

时间序列预测 —— DeepAR 模型

时间序列预测 —— DeepAR 模型 DeepAR 模型是一种专门用于处理时间序列概率预测的深度学习模型,它可以自动学习数据中的复杂模式,提高预测的准确性。本文将介绍 DeepAR 模型的理论基础、优缺点,并通过 Python 实现单步预测和多步预测的完整…

单片机项目调试中的技巧和常见问题解决

单片机是嵌入式系统中的重要组成部分,在各种电子设备中发挥着重要的作用。在单片机项目开发过程中,调试是至关重要的一环,同时也会遇到一些常见问题。本文将介绍一些单片机项目调试的技巧以及常见问题的解决方法,希望能够对单片机…

应用层 HTTP协议(1)

回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…

大模型2024规模化场景涌现,加速云计算走出第二增长曲线

导读:2024,大模型第一批规模化应用场景已出现。 如果说“百模大战”是2023年国内AI产业的关键词,那么2024年我们将正式迈进“应用为王”的新阶段。 不少业内观点认为,2024年“百模大战”将逐渐收敛甚至洗牌,而大模型在…

幻兽帕鲁专用服务器,多人游戏(专用服务器)搭建

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

如何用Hexo搭建一个优雅的博客

引言 在数字化时代,拥有一个个人博客已经成为许多人展示自己技能、分享知识和与世界互动的重要方式。而在众多博客平台中,Hexo因其简洁、高效和易于定制的特点而备受青睐。本文将详细介绍如何从零开始搭建一个Hexo博客,让你的个人博客在互联…

Tuxera NTFS2024永久免费版磁盘读写软件

Tuxera NTFS 2024由Tuxera公司开发,是一款专为Mac系统设计的NTFS磁盘读写软件。以下是这款软件的具体优势: 全面的读写功能:Tuxera NTFS 2024允许Mac用户全面读写NTFS格式的硬盘、U盘、SD卡等存储设备。这意味着用户可以在Mac上自由读取和写…

【JavaEE Spring 项目】博客系统

博客系统 前⾔项⽬介绍1. 准备⼯作1.1 数据准备1.2 创建项⽬1.3 准备前端⻚⾯1.4 配置配置⽂件1.5 测试 2. 项⽬公共模块2.1 实体类的编写2.2 公共层 3. 业务代码3.1 持久层3.2 实现博客列表3.3 实现博客详情3.4 实现登陆令牌技术JWT令牌介绍JWT令牌⽣成和校验 3.5 实现强制要求…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现(一个Boss线程,一个Worker线程) 8.2 多线程Reactor模…

SolidWorks学习笔记——入门知识1

目录 1、固定最近文档 2、根据需要自定义菜单栏 3、根据需要增添选项卡 4、命令搜索框 5、鼠标右键长按快速切换视图 6、鼠标笔势 自定义鼠标笔势 1、固定最近文档 图1 固定最近文档 2、根据需要自定义菜单栏 图2 根据需要自定义菜单栏 3、根据需要增添选项卡 图3 根据…

架构(十二)动态Excel

一、引言 作者最近的平台项目需要生成excel,excel的导入导出是常用的功能,但是作者想做成动态的,不要固定模板,那就看看怎么实现。 二、后端 先捋一下原理,前后端的交互看起来是制定好的接口,其实根本上是…

OCP使用CLI创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image创建route检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 通过 crc console --credentials 可以查看登录信息&…

Stable Video Diffusion图片转视频——Stability AI开源视频模型

我们前期介绍过Stable Diffusion,stable diffusion模型是Stability AI开源的一个text-to-image的扩散模型,其模型在速度与质量上面有了质的突破,玩家们可以在自己消费级GPU上面来运行此模型。 文生图大模型已经火了很长一段时间了&#xff0c…

专业130+总分410+苏州大学837信号系统与数字逻辑考研经验电子信息与通信,真题,大纲,参考书

今年考研总分410,专业837信号系统与数字逻辑130,整体每门相对比较均衡,没有明显的短板,顺利上岸苏大,总结一下自己这大半年的复习经历,希望可以对大家有所帮助,也算是对自己考研做个总结。 专业…

Java:常用API接上篇 --黑马笔记

一、 StringBuilder类 StringBuilder代表可变字符串对象,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。 好处:StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

11 插入排序和希尔排序

1. 插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;基本思想&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 在玩扑克牌时&#xff0c;就用…