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均为中…

PYTHON 120道题目详解(73-75)

73.Python中的random模块可以生成哪些类型的随机数&#xff1f; Python的random模块提供了多种生成随机数的方法&#xff0c;这些方法可以生成不同类型的随机数。以下是一些主要的&#xff1a; 随机浮点数&#xff1a; random(): 返回0 < n < 1之间的随机浮点数。uniform…

postman请求404 解决方式

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

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

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

时间序列预测 —— DeepAR 模型

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

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

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

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术

基于Python的海洋水动力模拟实践技术&#xff0c;可以结合潮汐、风驱动循环和风暴潮等因素进行模拟。以下是一些相关的实践技术&#xff1a; 潮汐模拟&#xff1a;Python可以通过调用相关的海洋模型库&#xff0c;如ECOMSED或ROMS&#xff0c;来进行潮汐模拟。潮汐模拟需要考虑…

应用层 HTTP协议(1)

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

Python学习之路-初识爬虫:基础知识

Python学习之路-初识爬虫:基础知识 什么是爬虫 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟客户端发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动地抓取互联网信息的程序。 原则上,只要是浏览器…

96.网游逆向分析与插件开发-游戏窗口化助手-窗口化助手与游戏窗口同步移动

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;窗口化助手显示与大小调整 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;e85c0fc8b85895c8c2d3417ec3…

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

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

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

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

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

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

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

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

魔术《守岁共此时》揭秘

魔术介绍 魔术《守岁共此时》是 2024 2024 2024 年春节联欢晚会上刘谦表演的魔术。刘谦共表演了两个魔术&#xff0c;其中的第二个魔术为观众共同参与的魔术。 第二个魔术的操作内容如下。 任取 4 4 4 张牌&#xff0c;打乱顺序。将 4 4 4 张牌撕开&#xff0c;变成 8 8…

【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模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

c#进程(Process)常用方法

在C#中&#xff0c;Process类提供了一系列用于操作进程的常用方法&#xff0c;以下是其中一些常用的方法&#xff1a; Start()&#xff1a;启动一个新的进程。 Process.Start("notepad.exe");Kill()&#xff1a;终止进程。 Process.GetProcessesByName("note…

[office] 使用TRANSPOSE函数实现EXCEL表横向转纵向引用的操作方法 #知识分享#知识分享

使用TRANSPOSE函数实现EXCEL表横向转纵向引用的操作方法 一、问题的提出 我们在使用EXCEL过程中&#xff0c;有时需要将一个表中数据的“列”变为“行”&#xff0c;&#xff0c;需要将表2中引用表1的数据&#xff0c;将“列”转换为“行”&#xff0c;即大家通常所说的引用E…

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

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