【进阶】Bean作用域和生命周期

news2024/11/25 2:47:23

努力经营当下,直至未来明朗!

文章目录

  • 一、通过⼀个案例来看 Bean 作⽤域的问题
    • 1. 被修改的Bean案例
    • 2. 原因分析
  • 二、作用域Scope定义
    • 1. Bean的六种作用域(重点)
      • 1)singleton
      • 2)prototype
      • 3)request
      • 4)session
      • 5)application
      • 6)WebSocket(了解)
      • 单例作用域(singleton)和全局作用域(application)的区别
    • 2. 设置Bean作用域
  • 三、Spring执行流程和Bean的生命周期
    • 1. Spring执行流程
    • 2. Bean的生命周期【重点】
  • 小结


普通小孩也要热爱生活!

一、通过⼀个案例来看 Bean 作⽤域的问题

1. 被修改的Bean案例

  1. 创建一个User类(私有变量,使用get、set方法进行修改)【千万不要忘记类注解
    0

  2. 公共Bean
    1

  3. A用户对name属性进行修改(Bean对象的注入注释+类注释
    2

  4. 输出用户A的操作结果
    3

  5. 用户B获取公共Bean对象(类注释+Bean对象注入注释
    5

  6. 输出用户B的操作结果
    6

  7. 发现:用户A对Bean对象操作直接影响了整个Bean对象。

  8. 注意:类中的@Bean注释的方法名要和属性注入声明的名字一致!

7


2. 原因分析

Bean 默认情况下是单例状态(singleton),也就是所有⼈的使⽤的都是同一个对象。使⽤单例可以很⼤程度上提⾼性能,所以在Spring 中Bean 的作⽤域默认也是 singleton 单例模式。


二、作用域Scope定义

  1. 限定程序中变量的可⽤范围叫做作⽤域,或者说在源代码中定义变量的某个区域就叫做作⽤域。
  2. Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式,⽐如 singleton 单例作⽤域,就表示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个⼈读取到的就是被修改的值。

1. Bean的六种作用域(重点)

1)singleton:单例模式(Spring默认)——【共享】
2)prototype:原型模式(Spring:类似多例模式)——每个请求一个作用域
3)request:请求作用域(Spring MVC)——一个请求一个作用域
4)session:会话作用域(Spring MVC)——一个会话/用户一个作用域
5)application:全局作用域(Spring MVC)——所有人都使用一个作用域(共享
6)websocket:HTTP WebSocket作用域(Spring WebSocket)——做即时工具的,如网页聊天(基于TCP / UDP都是ok的)

注:后 4 种状态是 Spring MVC 中的值,在普通的 Spring 项⽬中只有前两种。

1)singleton

① 官⽅说明:(Default) Scopes a single bean definition to a single object instance for each
Spring IoC container.
② 描述:该作⽤域下的Bean在IoC容器只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对象
③ 使用场景:无状态,没有地方需要对该对象的属性做修改/更新。
④ 备注:Spring默认选择该作⽤域。


2)prototype

① 官⽅说明:Scopes a single bean definition to any number of object instances.
② 描述:每次对该作⽤域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象实例。
③ 使用场景:有状态,可能有地方对该对象的属性做修改(也可能并不确定到底修不修改)
每次请求都创建新的实例,使用在Spring中


3)request

① 官⽅说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is,each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
② 描述:每次http请求会创建新的Bean实例,类似于prototype。
③ 使用场景:⼀次http的请求和响应的共享Bean
④ 备注:限定SpringMVC中使⽤。


4)session

① 官⽅说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
② 描述:在⼀个http session中,定义⼀个Bean实例
③ 场景:⽤户会话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息。
④ 备注:限定SpringMVC中使⽤。


5)application

① 官⽅说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
② 描述:在⼀个http servlet Context中,定义⼀个Bean实例。
③ 场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息。
④ 备注:限定SpringMVC中使⽤。


6)WebSocket(了解)

① 官⽅说明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
② 描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例。
③ 场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean。
④ 备注:限定Spring WebSocket中使⽤。


单例作用域(singleton)和全局作用域(application)的区别

项目类型:singleton 是 Spring Core 的作⽤域;application 是 Spring Web/ Spring MVC 中的作⽤域。
作用容器:singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器


2. 设置Bean作用域

  1. 使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:
    1) 直接设置值@Scope("prototype")
    2) 使⽤枚举设置@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

  2. 使用示例:(注意位置)
    ① 创建@Bean,并设置name属性
    8

② 用户C修改name属性
9

③ 用户D不作修改,直接返回原@Bean对象
10

④ 打印结果:用户C、D打印结果一致,说明此时是单例模式!(默认)
11

⑤ 如果想要修改模式,就在 @Bean注释的方法前面设置@Scope
A. 直接设置值:@Scope("prototype")
12

B.使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
13

⑥ 修改为原型模式之后输出结果:(两种方式输出都一样)
15


三、Spring执行流程和Bean的生命周期

1. Spring执行流程

  1. Spring / Bean执行流程图
    16

  2. Bean 执⾏流程(Spring 执⾏流程):启动 Spring 容器 -> 加载配置文件 -> 实例化 Bean(分配内存空间,从⽆到有) -> 扫描路径下的Spring注解 -> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)。


2. Bean的生命周期【重点】

生命周期,即诞生到销毁的整个过程。

  1. Bean的生命周期分为五大部分:【经典面试题
    1)实例化(为Bean分配内存空间) (买房)
    2)设置属性(对象注入和装配) (装修)
    3)初始化 (买家电:很多)

    A)执行各种Aware通知,如实现BeanNameAware等的接口方法
    B)执行BeanPostProcessor(接口)初始化的前置方法(设置了才有)
    C)执行构造方法,有两种执行方法:一种是执行@PostConstruct初始化方法(依赖注入操作之后执行),另一种是自己指定的init-method ⽅法。
    (两种同时出现时,@PostConstruct优于init-method)
    (init-method是以xml方式进行设置的)
    D)执行BeanPostProcessor初始化的后置方法

4)使用Bean (住房)
5)销毁Bean (卖房)

A)@PreDestroy(注解)
B)重写DisposableBean接口方法
C)destroy-method(xml方法)

注意:
① 注解需要注解到自己所实现的方法上,而destroy-method=”方法名”中的方法也是要自己去实现的。
也就是说:方法自己实现,然后添加注解@或method
② 补充:类 implements BeanPostProcessor接口,并重写postProcessAfterInitialization后置方法和postProcessBeforeInitialization前置方法
(详细参考:BeanPostProcessor接口)

  1. Bean生命周期执行流程图
    30

  2. 实例化和初始化的区别
    ① 实例化和属性设置是 Java 级别的系统“事件”,其操作过程不可⼈⼯⼲预和修改
    ② ⽽初始化是给开发者提供的,可以在实例化之后,类加载完成之前进⾏⾃定义“事件”处理。

  3. 为什么要先设置属性再进⾏初始化呢?
    顺序不能颠倒。
    理由
    ① 设置属性:是对象的注入和装配
    ② 初始化:包括执行通知、初始化的前置方法、构造方法(@PostConstruct、init-method)、初始化的后置方法
    ③ 在进行初始化的时候,如果一个类中需要调用另一个类的方法/实例化对象,那就需要先注入另一个类的对象;否则直接使用该类初始化时,到另一个对象时就会报空指针异常
    ④ 所以不能颠倒顺序,必须先设置属性,后初始化


小结

  1. Bean的六种作用域:singleton(默认)、prototype(Spring)、request、session、application、websocket(Spring MVC)【面试
  2. 设置Bean作用域两种方法@Scope
  3. Bean的生命周期:实例化、设置属性、初始化(通知Aware、BeanPostProcessor前置方法、构造方法@PostConstruct / init-method、BeanPostProcessor后置方法)、使用Bean、销毁Bean(@PreDestroy、DisposableBean接口重写方法、destroy-method)
  4. 实例化和初始化的区别
  5. 为什么先设置属性再初始化?

yyy

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

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

相关文章

JVM——类加载与字节码技术(2)

三、编译期处理 所谓的 语法糖 ,其实就是指 java 编译器把* .java 源码编译为* .class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利 【注意】以下代码的分析&am…

Python爬虫之基于 selenium 实现文献信息获取

目录初识 selenium网页分析代码实现踩过的坑最近有小伙伴后台跟我说,临近毕业,写毕业论文需要上知网查找大量的文献,但是一篇一篇看文献信息以及文献摘要又有点麻烦,能不能让我写一个爬虫去批量获取文献相关信息 我一听好家伙&am…

【算法】二叉树遍历

目录1.概述2.代码实现2.1.二叉树定义2.2.前序遍历2.3.中序遍历2.4.后序遍历2.5.层序遍历3.应用本文参考: LABULADONG 的算法网站 1.概述 (1)所谓遍历 (Traversal) 是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问…

《从零开始编写一个直播服务器》 C++ 实现一个最简单的HTTP-FLV流媒体服务器

流媒体服务系列文章 文章目录流媒体服务系列文章前言一、http flv?二、使用步骤服务器代码总结前言 HTTP FLV通过http传输,时延可控制在2秒以内,浏览器可基于bilibili开源的flv.js(采用h5 mse技术)开发,比起rtsp、rtmp等免插件播…

Spring BeanPostProcessor

BeanPostProcessor,是bean的增强器,在bean初始化前后调用,常用的方法有postProcessBeforeInitialization和postProcessAfterInitialization,在Spring启动并初始化bean前后通过它们做一些扩展操作。 1、BeanPostProcessor 接口说明…

【信管9.1】​项目沟通及过程

项目沟通及过程沟通这个东西,可以说是整个项目成功失败最关键的因素。9成以上失败的项目在最后总结的时候,沟通不畅或者信息对接问题都会占据前三甲。其实只要是做项目,那么必须有团队,有团队有人,那么沟通就是不可避免…

03 技术太卷我学APEX-关于blob数据类型的使用

03 技术太卷我学APEX-关于blob数据类型的使用 0 Oracle 的blob类型 BLOB BLOB全称为二进制大型对象(Binary Large Object)。它用于存储数据库中的大型二进制对象。可存储的最大大小为4G字节。 通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件…

外贸软件成本核算丨采购出入库有磅差怎么办

在液化天然气油料等行业,在与供应商之间的进出口贸易过程中,总是少不了会出现磅差的情况,因此就需要有磅差的约定。那什么是磅差呢?磅差指的是,供应方在发货时提供的磅单与购买方实际验收过磅数量之间的差额。一般磅差…

C++设计模式(1)——单例模式

亦称:单件模式、Singleton 意图 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题, 所以违反了单一职责原则: 1、保证一个类只…

CSS给元素添加边框(样式、颜色、宽度)

给元素添加边框 CSS边框属性允许你指定一个元素边框的样式和颜色, 和边框宽度。 可以使用 border 属性将边框样式,颜色,和宽度 一起设置。 如果不设置其中的某个值,也不会出问题,比如 border: solid #ff0000; 也是允许的。 使用border-style属性设置边…

ORA-39002: 操作无效 ORA-39070: 无法打开日志文件

今天在oracle12c上导数据,出现了错误。导库脚本久经考验,不应该有什么问题,但就是报错了。错误开头2句是: ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 网上搜来的结果,是存放导出文件的路径不对,就…

常用API(String、ArrayList)

API(应用程序接口) Java写好的技术(功能代码),可以直接调用String概述java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串Java程序中的所有字符串文字&a…

JavaEE进阶第三课:Spring更简单的对象存储和取出(上)

上篇文章介绍了Spring的创建和使用,讲解3了Bean对象的基本存储和取出,这篇文章我们将会介绍Spring更简单的对象存储 目录1.Bean的存储1.0准备工作1.1五大类注解1.1.2为什么要有这么多注解1.2方法注解1.1.1方法注解需要搭配类注解一起使用1.2.2方法重载怎…

详细实例说明+典型案例实现 对迭代法进行全面分析 | C++

第四章 迭代法 目录 ●第四章 迭代法 ●前言 ●一、迭代法是什么? 1.简要介绍 2.代码示例(简单理解) 3.生活实例 ●二、迭代法的典型案例——开平方&帕斯卡三角形 1.开平方 2.帕斯卡三角形 ●总结 前言 简单的来…

游戏服务器如何维护

随着游戏的不断发展,游戏服务器的维护的重要性日益提升。对于玩家而言,他们需要得到更好的体验和更快的速度来享受这个娱乐项目。而对于运营者来说,则是确保安全运行、避免中断或者延迟的工作。本文就将介绍游戏服务器如何维护。如果你的游戏…

基于混沌系统和DNA算法的RGB图像加密(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本文介绍了基于混沌系统和DNA编码的彩色数字图像加密、解密、抗噪声性能分析以及抗裁剪性能分析。 📚2 运行结果 &…

Linux cksum命令

Linux cksum命令用于检查文件的CRC是否正确。确保文件从一个系统传输到另一个系统的过程中不被损坏。CRC是一种排错检查方式,该校验法的标准由CCITT所指定,至少可检测到99.998%的已知错误。指定文件交由指令"cksum"进行校验后,该指…

Stream 管道流

文章目录前言Stream Api1、流的创建2、中间操作2.1、有状态① distinct② sorted③ limit④ skip⑤ concat2.2、无状态① filter② map③ flatMap④ peek⑤ mapToInt、mapToLong、mapToDouble、flatMapToDouble、flatMapToInt、flatMapToLong⑥ unordered3、终结操作3.1、短路操…

如何快速升级 Cocos Shader 版本,以简易水shader为例

白背景讲述如何 将一份 3.0.0 版本的水shader 升级至 Cocos Creator 3.6 。希望对大家有所帮助。环境Cocos Creator 3.6.2效果玉此处是鱼🐟,介绍如何使用在资源管理器中新建着色器(Effect)复制 文末的 mywater.effect 代码至当前文件在资源管理器中新建材…

Ai绘画生成软件哪个好用?这款AI作画的二次元太精致了

Ai绘画生成软件哪个好用呢?今天小编给大家推荐一款AI作画神器,用它生成的二次元真的是超级惊艳,每天每个手机号可以免费生成多张画作。 我们打开数画ai绘画,这是一款国产软件,使用的是自身研发的算法,目前…