Bean的6种作用域是什么?如何使用?
目录
前言
1.Bean的作用域
2.作用域类型
2.1、singleton
2.2、prototype
2.3、request
2.4、session
2.5、application
2.6、websocket
3、设置作用域
3.1设置方法
3.2、对比两种设置方式
小结
前言
Bean对象在Spring的IoC容器中是重要的资源,那么你知道它的作用域是什么吗?你会使用吗?让我们一起来看看~
1.Bean的作用域
我们知道程序中变量的可用范围叫做变量的作用域,那么Bean在Spring中又是IOC容器的重要资源,他的作用域是什么?Bean的作用域就是指Bean在Spring整个框架中的某种行为模式。例如singleton单例作用域,就表示Bean在整个Spring中只有一份,是全局共享的,当有人修改这个值后,那么其他人再读取到的便是修改后的值。
举个栗子,例如在Spring中定义了一个单例Bean对象student,如下:
@Component
public class StudentComponent {@Beanpublic Student student1() {Student stu = new Student();stu.setId(1);stu.setName("林俊杰");return stu;}}
然后在Modify类中通过setName修改了Student,如下代码:
@Controller
public class Modify {@Autowiredprivate Student student;public Student modifyStudent() {student.setName("周杰伦");return student;}}
最后在Read类中获取Student对象,如下代码:
@Controller
public class Read {@Autowiredprivate Student student;public Student readStudent() {Student stu = student;return stu;}}
这时我们调用Read类中的readStudent方法就会发现,Student类中原本的name = "林俊杰",变成了“周杰伦”,这就说明Bean对象默认就是单例作用域,在任何地方一旦修改了该单例对象,随后再访问这个对象的时候就是修改之后的对象。
2.作用域类型
Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域,作用域类型有如下6种,其中后两种只做了解:
- singleton:单例作用域(默认作用域);
- prototype:原型作用域(多例模式);
- request:请求作用域;
- session:会话作用域(类似多线程中的ThreadLocal);
- application:全局作用域(了解即可);
- websocket:HTTP WebSocket 作⽤域(了解即可)。
注意:在Spring中只有前两种适用,后四种状态是在Spring MVC中适用。
2.1、singleton
- 解释:该作用下的Bean在IOC容器中只有一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象。
- 适用场景:该Bean的属性状态不需要更新。
- Ps:Spring默认选择该作用域
2.2、prototype
- 解释:每次都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。
- 适用场景:该Bean的属性状态需要不断更新。
2.3、request
- 解释:每次Http请求都会创建新的Bean实例,类似prototype。
- 适用场景:一次Http的请求和响应共享Bean。
- Ps:限定Spring MVC中使用。
2.4、session
- 解释:在一个Http Session中,定义一个Bean实例。
- 适用场景:用户会话的时候共享 Bean, 比如:记录一个用户的登陆信息。
- Ps:限定Spring MVC中使用。
2.5、application
- 解释:在一个 Http Servlet Context 中,定义一个 Bean 实例。
- 适用场景:Web 应用的上下文信息,比如:记录一个应用的共享信息
- Ps:限定Spring MVC中使用。
2.6、websocket
- 解释:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
- 适用场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀ 次初始化后,直到WebSocket结束都是同⼀个Bean。
- Ps:限定Spring WebSocket中使⽤。
3、设置作用域
3.1设置方法
通过@Scope注解就可以设置Bean作用域,分别有以下两种方式:
a)直接设置值,例如:@Scope("prototype"),如下图:
b)设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量,例如 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),如下图:
注意:ConfigurableBeanFactory只提供了以下几种:
3.2、对比两种设置方式
上面提到的两种设置方式达到的效果都是一样的, 区别在于直接设置,是建立在你能够记得很清楚,保证不写错的前提下使用的;第二种方法,有IDEA的自动补全,可以保证不出错,这就像是IP地址和域名一样,域名就是方便我们记忆IP地址的一种形式,上述方法中的第二种就是方便记忆的一种方式~
小结
Bean作用域是Bean在Spring中的某种行为模式,常用的作用域是下面的前4种,后两种仅做了解:
1. singleton:单例作⽤域
2. prototype:原型作⽤域(多例作⽤域)
3. request:请求作⽤域
4. session:回话作⽤域
5. application:全局作⽤域
6. websocket:HTTP WebSocket 作⽤域
其中前两种是 spring 核⼼作⽤域,⽽后 4 种是 spring mvc 中的作⽤域,其中 bean 的作⽤域是最重要的知识点也是常⻅的⾯试题,一定要牢记~
Bean的6种作用域是什么?如何使用?相关推荐
- java中bean的作用域有哪些_Spring中Bean的5种作用域scope详解
Spring Bean简介: 在spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由Spring容器初始化 ...
- Spring支持如下5种作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- 厉害了,Spring中bean的12种定义方法!
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- spring中bean的5个作用域
bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...
- Spring注解定义 bean 的12种方法
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- Spring bean 的5个作用域 Spring Bean的默认作用域为:singleton。它相比其他作用域的优点是系统开销小,Bean实例一旦创建成功便可重复使用。 1.singleton作用域
Spring bean 的5个作用域 Spring Bean的默认作用域为:singleton.它相比其他作用域的优点是系统开销小,Bean实例一旦创建成功便可重复使用. 1.singleton作用域 ...
- Spring框架——Bean的Scope(作用域)易错陷阱解析
Spring框架--Bean的Scope(作用域)易错陷阱解析 阅读先修: 阅读本篇博文之前,您必须熟悉基本的有关Spring框架核心的IOC容器相关知识,以及基本的Bean配置方式.如若对该部分知识 ...
- 浅谈Spring的Bean生命周期和作用域
学习spring有一段时间了.有的人说Spring的发展就是Java的发展,Spring就是Java的半壁江山,而且AOP思想更是OOP思想的一种扩展和延申.所以今天来浅谈一下spring的生命周期和 ...
- SpringBoot静态获取 bean的三种方式,你学会了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...
最新文章
- 基于OpenCV的实时睡意检测系统
- LaTeX Test
- Laravel 中的环境与配置
- linux ffmpeg yum源,ffmpeg最新的yum源地址及视频去logo
- C++将地址转换为字符串
- mysql数据库 uft8_unicode_ci是utf8吗_MysQL数据库中utf8_unicode_ci与utf8_general_ci的区别
- python opencv3 —— 常用工具、辅助函数、绘图函数(图像添加文本、矩形等几何形状)
- atitit.提升开发效率---MDA 软件开发方式的革命(4)----编辑表单建模
- ubuntu下查看opencv版本
- Java-String类学习笔记
- Office小知识(三)——使用visio绘制流程图实例及遇到的一些问题
- 深度可分离卷积及其代码实现
- CSS 3之网页背景颜色
- C语言中getch()、getche()、getc()、getchar()、gets()、fgetc()、fgets()的区别与使用
- 详解17000tps的以太坊snark侧链方案
- 沈阳艺术设计培训就业班 (学制一年)
- 关于访问接口时前后端都报错:404 (Not Found)
- 电子电路基础 (1)——电子电路常识
- phpredis与predis的区别
- 广告 文案中最能赚钱的10个关键词