目录

前言

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种,其中后两种只做了解

  1. singleton:单例作用域(默认作用域);
  2. prototype:原型作用域(多例模式);
  3. request:请求作用域;
  4. session:会话作用域(类似多线程中的ThreadLocal);
  5. application:全局作用域(了解即可);
  6. 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种作用域是什么?如何使用?相关推荐

  1. java中bean的作用域有哪些_Spring中Bean的5种作用域scope详解

    Spring Bean简介: 在spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由Spring容器初始化 ...

  2. Spring支持如下5种作用域

    当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...

  3. 厉害了,Spring中bean的12种定义方法!

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  4. spring中bean的5个作用域

    bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...

  5. Spring注解定义 bean 的12种方法

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  6. Spring bean 的5个作用域 Spring Bean的默认作用域为:singleton。它相比其他作用域的优点是系统开销小,Bean实例一旦创建成功便可重复使用。 1.singleton作用域

    Spring bean 的5个作用域 Spring Bean的默认作用域为:singleton.它相比其他作用域的优点是系统开销小,Bean实例一旦创建成功便可重复使用. 1.singleton作用域 ...

  7. Spring框架——Bean的Scope(作用域)易错陷阱解析

    Spring框架--Bean的Scope(作用域)易错陷阱解析 阅读先修: 阅读本篇博文之前,您必须熟悉基本的有关Spring框架核心的IOC容器相关知识,以及基本的Bean配置方式.如若对该部分知识 ...

  8. 浅谈Spring的Bean生命周期和作用域

    学习spring有一段时间了.有的人说Spring的发展就是Java的发展,Spring就是Java的半壁江山,而且AOP思想更是OOP思想的一种扩展和延申.所以今天来浅谈一下spring的生命周期和 ...

  9. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

最新文章

  1. 基于OpenCV的实时睡意检测系统
  2. LaTeX Test
  3. Laravel 中的环境与配置
  4. linux ffmpeg yum源,ffmpeg最新的yum源地址及视频去logo
  5. C++将地址转换为字符串
  6. mysql数据库 uft8_unicode_ci是utf8吗_MysQL数据库中utf8_unicode_ci与utf8_general_ci的区别
  7. python opencv3 —— 常用工具、辅助函数、绘图函数(图像添加文本、矩形等几何形状)
  8. atitit.提升开发效率---MDA 软件开发方式的革命(4)----编辑表单建模
  9. ubuntu下查看opencv版本
  10. Java-String类学习笔记
  11. Office小知识(三)——使用visio绘制流程图实例及遇到的一些问题
  12. 深度可分离卷积及其代码实现
  13. CSS 3之网页背景颜色
  14. C语言中getch()、getche()、getc()、getchar()、gets()、fgetc()、fgets()的区别与使用
  15. 详解17000tps的以太坊snark侧链方案
  16. 沈阳艺术设计培训就业班 (学制一年)
  17. 关于访问接口时前后端都报错:404 (Not Found)
  18. 电子电路基础 (1)——电子电路常识
  19. phpredis与predis的区别
  20. 广告 文案中最能赚钱的10个关键词

热门文章

  1. 【操作系统】30天自制操作系统--(27)文件操作
  2. 实时人脸性别和年龄识别
  3. 计算机三级网络技术知识点(八)
  4. Angular4 - 启动过程
  5. PHP获取当前url地址 不带参数
  6. 为人处世方面的一些小经验
  7. Linux守护进程(daemon)
  8. 笨办法学Python3 习题39和习题40
  9. js的True、False判断
  10. 百度产品经理笔试题目(长沙地区)