Spring Bean作用域

news2024/11/19 19:33:23

目录

什么是作用域呢 ?

那什么又是Spring Bean的作用域呢 ?

Spring框架默认Bean作用域是什么呢 ?

Spring Bean的作用域都有哪些呢 ?

如何设置Bean作用域


什么是作用域呢 ?

在JavaSE中,作用域就是指一个变量可生效的范围. 就比如一个变量的作用域是方法的代码块的范围,只在方法内部生效.

那什么又是Spring Bean的作用域呢 ?

我来给一下官方的定义: Spring Bean的作用域是指Bean在整个框架中的某种行为模式.

看着这官方定义是有点懵 啥叫行为模式.

那就在举一个例子 : Singleton是单例作用域,那就是指对于一个Bean,它在整个Spring框架中只存在一份,是全局的共享的,如果要操作这个Bean,所有人都操作这一份Bean.

也就是当一个人将这个Bean被修改了,其他人读取到的就是被修改之后的值.

Spring框架默认Bean作用域是什么呢 ?

我们来实战演练一把,通过这个示例就可以知道Spring默认Bean 作用域是什么了.

有一个Bean为commonBean,假设张三来写一个类来初始化这个Bean然后将Bean存储到Spring中,李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改,王五要使用这个公共的Bean.

commonBean

public class CommonBean {
    //创建一个公共的对象供给两个人去使用
    private String name;
    private int age;
    private int id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "CommonBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}

张三来写一个类来初始化这个Bean然后将Bean存储到Spring中

@Controller
public class CommonScope {
    //公共的类->供给其他人使用
    //使用Bean注解将公共类返回的公共Bean存到Spring中
    @Bean
    public CommonBean doCommonBean(){
        CommonBean commonBean = new CommonBean();
        commonBean.setName("Java");
        commonBean.setAge(19);
        commonBean.setId(2000);
        return commonBean;
    }
}

李四去新创建一个对象来引用这个公共Bean(commonBean),然后使用并修改

@Controller
public class ScopeController1 {
    @Autowired
    private CommonBean commonBean;

    public void doScopeController1() {
        //李四自己创建一个对象引用公共的Bean
        CommonBean commonBean1 = commonBean;
        System.out.println("修改前的数据" + commonBean);
        commonBean1.setName("C++");
        System.out.println("修改后的数据" + commonBean1);
    }
}

王五要使用这个公共的Bean.

@Controller
public class ScopeController2 {

    @Autowired
    private CommonBean commonBean;

    public void doScopeController2(){
        System.out.println("使用公共的Bean信息为 : " + commonBean);
    }
}

启动类进行使用

public class App {
    //启动类
    public static void main(String[] args) {
        //获取到SpringContext上下文对象
        ApplicationContext context1 = new ClassPathXmlApplicationContext
                ("spring-config.xml");
        System.out.println("=================================");
        ScopeController1 scopeController1 = context1.getBean("scopeController1", ScopeController1.class);
        scopeController1.doScopeController1();
        System.out.println("=================================");
        ScopeController2 scopeController2 = context1.getBean("scopeController2", ScopeController2.class);
        scopeController2.doScopeController2();
    }
}

这个时候就会有情况发生我们接下来看运行结果

所以从这里就可以知道Spring框架默认Bean的作用域就是单例作用域.

Spring Bean的作用域都有哪些呢 ?

Spring一共有6种作用域.Spring在为Bean初始化的时候就会设置作用域.

分别为下面6种作用域

  • 单例作用域(singleton)

单例作用域是Spring默认的作用域.

单例作用域下 : Bean在SpringIOC容器只存在一个实例,也就是获取Bean(context.getBean())和注入/装配Bean(比如AutoWired注入3)操作Bean的都是同一个Bean

适用场景 : 单例作用域一般适用于无状态的Bean(Bean的状态不需要更新).

  • 多例作用域(prototype)

多例作用域也叫原型作用域

对于一个Bean,每次访问这个Bean都会创建新的实例.

也就是在Spring中获取Bean(context.getBean())或者注入Bean(AutoWired注入Bean)操作的这个Bean都是新创建的Bean

适用场景 : 多例作用域一般适用于有状态的Bean(Bean的状态需要更新).

  • 请求作用域(request)

在请求作用域下,每次HTTP请求都会创建新的Bean实例.

这个与prototype类似 但是不相同 prototype是每次访问Bean就创建,而request是每次HTTP请求创建新的实例(每次HTTP请求也可能访问多个Bean)

适用场景 : 请求作用域在Spring MVC场景下才能够生效 适用于一次HTTP请求共享Bean

  • 会话作用域(session)

在会话作用域下,每次session会话都会创建一个新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于在一次会话共享Bean

  • 全局作用域(Application)

在一个Http Servlet Context 中创建一个实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,适用于Web应用的上下文信息

  • WebSocket(了解即可)

在一个HTTP WebSocket的生命周期中,创建新的实例

适用场景 : 请求作用域在Spring MVC场景下才能够生效,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean

在Bean初始化的时候,就会为Bean设置其作用域.

Spring共有6种作用域

其中单例作用域和多例作用域在Spring框架中使用

请求作用域,会话作用域,全局作用域,WebSocket 只有在SpringMVC框架中才会生效.

如何设置Bean作用域

有两种方式设置Bean的作用域

第一种是直接设置值

比如我们来设置多例作用域

第二种是通过枚举的方式

比如我们来设置多例作用域

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

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

相关文章

fpga实操训练(signal tap调试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 编写软件的同学都知道,如果需要调试软件的话,除了要学会打印信息日志之外,另外一个很重要的方面,就…

http 库的服务端实现

前言 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 上两篇文章介绍了 http 客户端的实现,这篇文章看一下服务端的实现 服务端 使用 net/http 库可以快速搭建HTTP服务,HTTP服务端主要包含两部分: …

5G无线技术基础自学系列 | 5G网络切换问题分析

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线通信的最大特点在于其具有移动性&a…

提高搜狗PR最好的方法与搜狗PR权重在线查询

搜狗PR是什么? 搜狗PR值全称为搜狗PageRank(网页级别),是搜狗用于用来标识网页的等级、重要性的一种方法,是搜狗用来衡量一个网站的好坏的重要标准之一。 搜狗在揉合了诸如Title标识和Keywords标识等所有其它因素之后,通过PageRank来…

react学习

1. React概述 1.1 什么是react? React 是一个用于构建用户界面的 JavaScript 库 用户界面:HTML页面(前端) React 主要用来写HTML页面,或构建Web应用如果从 MVC 的角度来看,React 仅仅是视图层(V),也就是只负责视图的染&#xff0…

Day44——Dp专题

文章目录子序列问题27.最长递增子序列28、最长连续递增序列29、最长重复子数组30、最长公共子序列31、不相交的线32、最大子序和33、判断子序列34、不同的子序列35、两个字符串的删除操作36、编辑距离37、回文子串38、最长回文子序列动态规划总结篇背包问题系列股票系列子序列系…

java论坛贴子网站ssm论坛项目发帖子网站论坛系统论坛源码

ssm开发的论坛系统,用户注册后可以发布帖子,其他人可以评论回复点赞评论和点赞回复,用户可以在个人中心管理自己的帖子,以及查看自己对他人的回复,和他人对自己的回复。 演示视频: https://www.bilibili.c…

图(Graph)的定义

图(Graph)的定义 文章目录图(Graph)的定义●图的形式化定义:G (V,E)●无向图和有向图的表示形式:● 有向图和无向图的定义●抽象数据类型定义ADT●图形结构属于复杂的非线性结构● 图由顶点的集合和边的集合构成 ●图的形式化定义:G (V,E) • 集合V(vertex):顶点的有限集合,…

多线程基础入门

文章目录前言一、认识线程(一)概念1.线程是什么2.为啥要有线程(轻量级进程)为什么线程比进程更轻量经典面试题:谈谈进程和线程的区别和联系3.线程的结构(二)第一个多线程程序(三&…

Java中的自旋锁,手动实现一个自旋锁

自旋锁 CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁, 当线程发现锁被占用时,会不断循环判断锁的状态&#xff0…

计算机网络最新复习【太原理工大学】

课后题 Word 版,提取码:5201https://pan.baidu.com/s/13xzx8qr8Mnh4TWTS_dEYxA 目录 一、题型 二、考点 一、题型 1. 选择题 40 个,每个 1 分,共 40 分。(大部分可一眼看出答案) 2. 填空题 15 个&…

最长上升子序列优化(贪心+二分)(超级详细的讲解)

最长上升子序列优化(贪心二分一、回顾1、问题描述2、动规代码弊端二、优化1、算法优化2、代码实现一、回顾 1、问题描述 2、动规代码弊端 我们之前的动规代码的时间复杂度是O(n2)O(n^2)O(n2)。如果大家还不知道动态规划的逻辑的话,建议大家先去看一下动…

我国用电信息采集系统行业应用需求及市场容量分析 现6省上线运行

用户用电信息采集系统是通过对配电变压器和终端用户的用电数据的采集和分析,实现用电监控、推行阶梯定价、负荷管理、线损分析,最终达到自动抄表、错峰用电、用电检查(防窃电)、负荷预测和节约用电成本等目的。建立全面的用户用电…

VuePress初学之利用模板theme创建一个个人博客网站

目录前言官方文档创建项目创建目录安装VuePress初始化项目创建文档修改package.json运行项目修改README.md的编码显示官方默认主题创建.vuepress文件创建config.js修改README.md补充logo资源运行效果更多默认主题配置开源主题vuepress-theme-reco安装脚手架初始化项目安装npm运…

为什么说L2毫秒接口的应用比较广泛?

和其它的数据接口一样,这L2毫秒接口也起到了一个媒介的作用,将所有的股票信息都传递到了另外一个软件上。因为市场上的股票种类很多,所以每一种股票都具有其特有的信息,是进行股票买卖的基础。 为什么说L2毫秒接口的应用比较广泛…

MCU-51:矩阵键盘

题目一、矩阵键盘介绍1.1 矩阵键盘1.2 扫描的概念二、编程2.1 LCD屏显示“HelloWord”2.2 矩阵键盘程序三、矩阵键盘应用一、矩阵键盘介绍 1.1 矩阵键盘 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描…

Flowable学习笔记(一):SpringBoot项目整合Flowable

1.基于k8s部署Mysql 参考:k8s部署mysql 我安装是去掉了卷挂载。安装过程可能出现磁盘容量不够,可以通过df -h查看。 镜像下载得比较慢,可以先用docker拉取镜像。 2.搭建SpringBoot项目 (1)搭建maven项目,pom.xml依赖如下&am…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

我国农村水利水电行业项目投资、水电站建设及装机容量情况分析

一、农村水利水电行业投资情况 根据水利部数据显示,2020年农村水利水电累计下达投资428.63亿元(其中中央投资214.84亿元,地方投资213.79亿元)。其中,中央预算内投资97.75亿元,中央财政水利发展资金100.96亿…

【MindStudio训练营第一季】基于U-Net网络的图像分割的MindStudio实践

前情说明 本作业基于Windows版MindStudio 5.0.RC3,远程连接ECS服务器使用,ECS是基于官方分享的CANN6.0.RC1_MindX_Vision3.0.RC3镜像创建的。 基于ECS(Ascend310)的U-Net网络的图像分割 1. U-Net网络介绍: U-Net模…