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://xiahunao.cn/news/2778077.html

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

相关文章

Android:内存泄漏检查内存优化

3.17Android优化 手机移动设备的内存是有限的,需要避免内存泄漏,优化内存使用。 1.java中四种引用类型 强引用、软引用、弱引用、虚引用。 强引用:使用类构造方法,创建对象,当内存超出了,也不会释放对象所占内存空间; String str = new String(‘1223’); 切断引用str=…

Python pandas中read_csv函数的io参数

前言 在数据分析和处理中,经常需要读取外部数据源,例如CSV文件。Python的pandas库提供了一个强大的 read_csv() 函数,用于读取CSV文件并将其转换成DataFrame对象,方便进一步分析和处理数据。在本文中,将深入探讨 read…

Java与MySQL的精准结合:打造高效审批流程

1流程思路分析 审批流程🐱‍💻 1.串行流程 当前节点审批完成后,下一次节点才能进行操作,例如经理通过之后,总监才能审批; 2.并行流程 一个审批节点需要多人联审。一般有两种方式:会签、或签…

尚硅谷 Vue3+TypeScript 学习笔记(中)

目录 三、路由 3.1. 【对路由的理解】 3.2. 【基本切换效果】 3.3. 【两个注意点】 3.4.【路由器工作模式】 3.5. 【to的两种写法】 3.6. 【命名路由】 3.7. 【嵌套路由】 3.8. 【路由传参】 query参数 params参数 3.9. 【路由的props配置】 3.10. 【 replace属性…

C++,stl,list容器详解

目录 1.list基本概念 2.list构造函数 3.list的赋值和交换 4.list大小操作 5.list的插入的删除 6.list数据存取 7.list反转和排序 排序案例 1.list基本概念 2.list构造函数 #include<bits/stdc.h> using namespace std;void print(const list<int> &lk) …

.NET命令行(CLI)常用命令

本文用于记录了.NET软件开发全生命周期各阶段常用的一些CLI命令&#xff0c;用于开发速查。 .NET命令行&#xff08;CLI&#xff09;常用命令 项目创建&#xff08;1&#xff09;查看本机SDK&#xff08;2&#xff09;查看本机可以使用的.NET版本&#xff08;3&#xff09;生成…

【开源】SpringBoot框架开发桃花峪滑雪场租赁系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

基于完全二叉树实现线段树-- [爆竹声中一岁除,线段树下苦踌躇]

文章目录 一.完全二叉树完全二叉树的父子结点引索关系 二.线段树三.基于完全二叉树实现线段树关于线段树的结点数量问题的证明递归建树递归查询区间和递归单点修改线段树模板题 一.完全二叉树 完全二叉树的物理结构是线性表,逻辑结构是二叉树 完全二叉树的父子结点引索关系 …

【数据结构】双向链表(链表实现+测试+原码)

前言 在双向链表之前&#xff0c;如果需要查看单链表来复习一下&#xff0c;链接在这里&#xff1a; http://t.csdnimg.cn/Ib5qS 1.双向链表 1.1 链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.1.1 单向或者双向 1.1.2 …

专业135+总400+中国科学院大学859国科大信号与系统考研经验电子信息与通信,真题,大纲,参考书

今年考研专业课859信号与系统135&#xff0c;总分400上岸国科大&#xff0c;总结一下自己这一年的复习经验&#xff0c;希望对后面报考中科院大学的同学有所帮助。 专业课&#xff1a; 国科大不同研究所都是统一命题&#xff0c;859信号与系统的参考书目是郑君里的《信号与系…

C语言——oj刷题——调整数组使奇数全部都位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 一、实现方法&#xff1a; 当我们需要对一个整数数组进行调整&#xff0c;使得奇数位于数…

[职场] 职场上该如何和同事相处呢?七种方法教你和同事友好相处 #其他#媒体

职场上该如何和同事相处呢&#xff1f;七种方法教你和同事友好相处 在职场上&#xff0c;如何和同事相处是一堂必修课。同事&#xff0c;是我们天天必须看到的人&#xff0c;只有和同事友好相处&#xff0c;我们才能生活得更好&#xff0c;工作得更好。那么&#xff0c;我们在…

Days 27 ElfBoard 板 AltiumDesigner 相同电路快速布局布线

在进行设计开发的时候&#xff0c;总会遇到相同的电路&#xff0c;或者模块&#xff0c;这些电路可以使用相同的布局和走线&#xff0c;例如 DC-DC 电源、网口 PHY 电路部分。这类型的电路&#xff0c;我们可以采用AltiumDesigner 中的 Room 进行布局和布线的快速复制&#xff…

备战蓝桥杯---动态规划之背包问题引入

先看一个背包问题的简单版&#xff1a; 如果我们暴力枚举可能会超时。 但我们想一想&#xff0c;我们其实不关心怎么放&#xff0c;我们关心的是放后剩下的体积。 用可行性描述即可。 于是我们令f[i][j]表示前i个物品能否放满体积为j的背包。 f[i][j]f[i-1][j]||f[i-1][j-v…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

使用Arduino UNO和蓝牙模块制作智能小车

目录 概述 1 硬件结构 1.1 硬件组成 1.2 蓝牙模块介绍 1.3 控制板IO引脚定义 2 机械结构 3 固件设计 4 App设计 5 参考文献 概述 本文主要介绍使用Arduino UNO作为主板&#xff0c;用于控制电机和接收蓝牙模块数据。蓝牙模块用于从手机App上接收控制信号&#xff0c;使…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第10章 项目进度管理(四)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

巴尔加瓦算法图解:算法运用(上)

目录 树反向索引傅立叶变换 并行算法MapReduce函数 树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个…

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果&#xff08;升级版&#xff09; 7.P1618 三连击&…

软件价值11-简单计算器

用python的tkinter做的简单计算器 代码&#xff1a; import tkinter as tkdef button_click(item):global expressionexpression expression str(item)input_text.set(expression)def button_clear():global expressionexpression ""input_text.set(""…