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 的默认作用域,单例模式
    @Bean
    public 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
    @RequestScope
    public User requestUser(){
        return new User();
    }

    //作用域:session 会话
    //每个 HTTP Session ⽣命周期内,创建新的实例(web环境中)
    @Bean
    @SessionScope
    public User sessionUser(){
        return new User();
    }

    //作用域:application 应用
    @Bean
    @ApplicationScope
    public 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")  //设置注入对象的名称
    @Autowired
    private User defaultBean;

    //作用域为单例(singleton)时获取的对象
    @Qualifier("singletonUser")
    @Autowired
    private User singletonBean;

    //作用域为原型(prototype)时获取的对象
    @Qualifier("prototypeUser")  //设置注入对象的名称
    @Autowired
    private User prototypeBean;

    //作用域为 HTTP 请求(request)时获取的对象
    @Qualifier("requestUser")  //设置注入对象的名称
    @Autowired
    private User requestBean;

    //作用域为会话(session)时获取的对象
    @Qualifier("sessionUser")  //设置注入对象的名称
    @Autowired
    private User sessionBean;

    //作用域为 ServletContext⽣命周期内(application)时获取的对象
    @Qualifier("applicationUser")  //设置注入对象的名称
    @Autowired
    private User applicationBean;

    //注入 Spring 的 IoC 容器,注意 applicationContext 导入的包是 springframework 的
    @Autowired
    private 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 可以有多个.(了解即可)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JDK新特性

JDK新特性 函数式接口和Lambda 表达式Stream流操作新日期API操作其他新特性 Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码 像数据一样进行传递)。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码…

操作系统-【预备学习-1】(Linux 文件目录)

文章目录 相关知识目录结构进入目录补充查看目录创建文件删除文件创建文件夹删除文件夹文件和文件夹拷贝文件和文件夹移动/重命名 任务要求 相关知识 目录结构 Linux 文件系统是树形层次结构,具体如下图所示,最重要的是根目录(/&#xff09…

8868体育助力西甲皇家马德里俱乐部 帮助球队把握榜首大战

西甲的皇家马德里足球俱乐部是8868体育合作的俱乐部之一,皇家马德里目前取得18胜3平1负的成绩,排名西甲联赛第一的位置,本赛季主场也有着9胜1平的不败成绩,处于第二的位置,主场的发挥相当突出。目前皇家马德里已经是重…

2.8学习总结

2.8 1.二叉树的前序遍历 2.二叉树的中序遍历 3.二叉树的后序遍历 4.⼆叉树的层序遍历 5.⼆叉树的层序遍历2 6.二叉树的右视图 7.二叉树的层平均值 8.N叉树的层序遍历 9.每个树行中找最大值 10.填充每个节点的下一个右侧节点指针 11.填充每个节点的下一个右侧节点指针2 12.生命之…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理

目录 一、时间管理1.1、时间接口 一、时间管理 时间管理以系统时钟为基础,给应用程序提供所有和时间有关的服务。系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为…

【GO语言卵细胞级别教程】04.GO函数介绍

【GO语言卵细胞级别教程】04.GO函数介绍 目录: 【GO语言卵细胞级别教程】04.GO函数介绍0.创建项目1.函数的引入2.注意事项3.详细介绍3.1 形参介绍 0.创建项目 创建目录 执行命令加载模块 cd 02.gostudy目录下 1.进入目录下 cd 02.gostudy 2.初始化模块变量 go …

【计算机网络】时延,丢包,吞吐量(分组交换网络

时延 结点处理时延(nodal processing delay) dproc 排队时延(queuing delay) dqueue 传输时延(transmission delay) dtrans 路由器将分组推出所需要的时间,是分组长度和链路传输速率的函数 传播时…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇😀 (祝广大IT学习者、工作者0 error 0 warning!) 一,DDL数据库操作 (一)库的查询操作 1.列出所有已定义数据库 show databases; 2.查询当前所处数据库 select database(); &…

Matlab使用点云工具箱进行点云配准ICP\NDT\CPD

一、代码 主代码main.m,三种配准方法任选其一 % 读取点云文件 source_pc pcread(bun_zipper.ply); target_pc pcread(bun_zipper2.ply);% 下采样 ptCloudA point_downsample(source_pc); ptCloudB point_downsample(target_pc);% 配准参数设置 opt param_set…

【初中生讲机器学习】7. 交叉验证是什么?有哪些?怎么实现?来看!

创建时间:2024-02-10 最后编辑时间:2024-02-10 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【深度学习:SegGPT】在上下文中分割所有内容 [解释]

【深度学习:SegGPT】在上下文中分割所有内容 [解释] SegGPT与以前的模型相比如何?SegGPT在实践中是如何工作的?SegGPT培训计划上下文着色上下文集成上下文调整SegGPT 训练参数 如何尝试 SegGPT?使用哪些数据集来训练 SegGPT&#…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

vue.js基于springboot的实验室设备管理系统10345

(1)设备信息模块&#xff1a;记录设备的基本信息&#xff0c;如设备采购来源信息、设备需求量、当前数量、日期等。 (2) 用户模块&#xff1a;教师职工。实现对用户个人信息、消息管理和实验室设备的查询使用申请等。 (3) 管理员模块&#xff1a;实现对所有设备信息的增删改查&…

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二)

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画&#xff0c;Kotlin&#xff08;二&#xff09; 文章 https://zhangphil.blog.csdn.net/article/details/135980821 实现了基于Matrix缩放Bitmap的动画&#xff0c;但是从左上角&#xff08;0,0&#xff09;位…

FPGA_简单工程_状态机

一 理论 fpga是并行执行的&#xff0c;当处理需要顺序解决的事时&#xff0c;就要引入状态机。 状态机&#xff1a; 简写FSM&#xff0c;也称同步有限状态机。 分为&#xff1a;more型状态机&#xff0c;mealy型状态机。 功能&#xff1a;执行该事件&#xff0c;然后跳转到下…

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本(阿里云)

幻兽帕鲁服务器怎么更新&#xff1f;进入游戏显示&#xff1a;加入的比赛正在运行不兼容的版本&#xff0c;请尝试升级游戏版本。这是因为游戏客户端或者服务器上的游戏服务端&#xff0c;没有更新版本。导致两个版本不一致&#xff0c;所以无法进入游戏。 最近幻兽帕鲁 官方客…

统计数字出现次数的数位动态规划解法-数位统计DP

在处理数字问题时,我们经常遇到需要统计一定范围内各个数字出现次数的情况。这类问题虽然看起来简单,但当数字范围较大时,直接遍历统计的方法就变得不再高效。本文将介绍一种利用数位动态规划(DP)的方法来解决这一问题,具体来说,是统计两个整数a和b之间(包含a和b)所有…

CSS 2D转换 3D动画 3D转换

目录 2D转换(transform): 移动translate: 旋转rotate: 缩放scale&#xff1a; CSS3动画&#xff08;transform&#xff09;&#xff1a; 动画常用的属性&#xff1a; 将长图片利用盒子实现动画的效果&#xff1a; 3D转换&#xff1a; 透视perspective&#xff1a; 旋转r…

点云——噪声(代码)

本人硕士期间研究的方向就是三维目标点云跟踪&#xff0c;对点云和跟踪有着较为深入的理解&#xff0c;但一直忙于实习未进行梳理&#xff0c;今天趁着在家休息对点云的噪声进行梳理&#xff0c;因为预处理对于点云项目是至关重要的&#xff0c;所有代码都是近期重新复现过。 这…

【并发编程】锁-源码分析

1、ReentrantLock 1.1 加锁流程源码 1.1.1 加锁流程概述 1.1.2 lock源码分析 1.1.2.1 公平和非公平锁方式 // 非公平锁 final void lock() {// 上来就先基于CAS的方式,尝试将state从0改为1if (compareAndSetState(0, 1))// 获取锁资源成功,会将当前线程设置到exclusiveOwn…