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.hqwc.cn/news/463437.html

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

相关文章

【 buuctf snake 】

需要用到 Serpent 加密,蛇也不一定是 snake,serpent 也是蛇的意思。 binwalk -e /Users/xxx/Downloads/snake/snake.jpgbinwalk 提取 key 中有 base64 编码,解密 图源自BUUCTF:snake_buuctf snake-CSDN博客 结果是 anaconda,还有…

ESP8266 tcpsocket透传模式流程介绍

一、整体流程介绍 二、固件介绍 固件视频演示地址: ESP8266-配网&热点设置说明_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1hq4y127dN/?spm_id_from333.999.0.0

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博,校园网屏蔽了所有内网穿透的工具的数据包和IP访问,为了实现在家也能远程访问服务器,就不得不先开个学校VPN,再登陆。我们实验室还需要访问另一个大学的服务器,每次我都要去找另一个大学…

python从入门到精通(十六):python爬虫的BeautifulSoup4

python爬虫的BeautifulSoup4 BeautifulSoup4导入模块解析文件创建对象python解析器beautifulsoup对象的种类Tag获取整个标签获取标签里的属性和属性值Navigablestring 获取标签里的内容BeautifulSoup获取整个文档Comment输出的内容不包含注释符号BeautifulSoup文档遍历Beautifu…

电子电器架构 —— 区域控制器是未来架构的正解吗?

电子电器架构 —— 区域控制器是未来架构的正解吗? 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶…

IDEA生成可执行jar包

1. 进入需要打包的项目,选择 最上方菜单栏的 File → Project Structure 2. 选择 左侧菜单栏 Artifacts → 加号 → JAR → from modules with dependencies 3. 选择入口类 Main Class(点击文件夹图标可以快速选择),点击 OK&#…

CSP-202012-2-期末预测之最佳阈值

CSP-202012-2-期末预测之最佳阈值 【70分思路】 本题的难点还是时间复杂度,暴力枚举会导致时间超限。对于每一个可能的阈值theta,代码都重新计算了整个predict数组,统计预测正确的数目,因为有两个嵌套的循环,使得时间…

Redis(02)——事务管理

事务概念 Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化,在事务执行过程中,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中 Redis事务…

图书商城系统

文章目录 图书商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目(9.9¥带走) 图书商城系统 一、项目演示 网上书城 二、项目介绍 基于SSM的图书商城网站 运行环境:idea或eclipse 数据库:mysql 开发语…

外包干了一个月,技术明显进步。。。。

先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述:flag在数据库里面。 开题: 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面,有一个搜索框。 F12看看network。 又出现了这个Wor…

【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、分布…