Spring为什么这么火 之 Bean的6种作用域和Bean的生命周期
创始人
2024-05-24 03:28:45
0

1、Bean的作用域

1.1、什么是作用域?

        限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域

1.2、Bean的6种作用域

  • singleton:单例作用域
  • prototype:原型作用域【多例作用域】
  • request:请求作用域
  • session:回话作用域
  • application:全局作用域
  • websocket:HHTP WebSocket作用域

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


singleton——单例作用域

  • 含义:该作用域下的Bean在IoC容器中只存在一个实例:获取Bean及装配Bean都是同一个对象
  • 场景:通常无状态的Bean使用该作用域【无状态:表示Bean对象的属性状态不需要更新】
  • 备注:Spring默认选择该作用域

prototype——原型作用域【多例作用域】

  • 含义:每次对该作用域下的Bean的请求都会创建新的实例:获取Bean及装配Bean都是新的对象实例
  • 场景:通常有状态的Bean使用该作用域

request——请求作用域

  • 含义:每次http请求会创建新的Bean实例,类似于prototype
  • 场景:一次http的请求和响应的共享Bean
  • 备注:限定SpringMVC中使用

session——回话作用域

  • 含义:在一个http session中,定义一个Bean实例
  • 场景:用户回话的共享Bean,比如:记录一个用户的登录信息
  • 备注:限定SpringMVC中使用

application:全局作用域

  • 含义:在一个http servlet Context中,定义一个Bean实例
  • 场景:Web应用的上下文信息,比如:记录一个应用的共享信息
  • 备注:限定SpringMVC中使用

websocket——HHTP WebSocket作用域

  • 定义:在一个HTTP WebSocket的生命周期中,定义一个Bean实例
  • 场景:WebSocket的每次会话中,保存一个Map结构的头信息,将用来包裹客户端消息头【第一次初始化后,直到WebSocket结束都是同一个Bean
  • 备注:限定Spring WebSocket中使用

单例作用域(singleton)VS 全局作用域(application)

  • singleton是Spring Core的作用域;application是Spring Web中的作用域
  • singleton作用于IoC的容器;application作用于Servlet容器

1.3、如何设置作用域

  • @Scope("prototype")直接设置值
  • @Scope(ConfigurableBeanFactory.SCOPE_PRTOTYPE)全局变量的方式设置


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

2.1、Spring启动和加载流程

 

 Bean 执⾏流程(Spring 执⾏流程):启动 Spring 容器 -> 实例化 Bean(分配内存空间,从⽆到有) -> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(取操作)。

  • 启动容器【启动项目】
  • 读取配置文件,初始化【使用xml直接注册bean;配置bean根(扫描)路径】
  • 将Bean存储到Spring中,通过类注解进行扫描和装配
  • 将bean从Spring读取出来,装配到相应的类 

2.2、Bean生命周期

Bean 的⽣命周期分为以下 5 ⼤部分:

1.实例化 Bean(为 Bean 分配内存空间)

2.设置属性(Bean 注⼊和装配)

3.Bean 初始化

1、执行各种通知(各种Aware)
比如:
        Spring在初始化 bean,是需要给 bean 赋予 id(name)。
        而设置 beanName 成功的话,就会生成一个 beadNameAware 通知。

2、执行初始化的前置方法
        前提:我们重新 前置方法,不然它按照源码来操作。

3、执行构造方法,两种执行方式。
  3.1、执行具有 @PostConstruct 注解的方法。【PostConstruct -> 初始化方法】
  3.2、执行 init-method 方法,是 Spring 中 配置文件里面 的 bean 标签所有具有的属性。

        这个 两个执行方法,是两个不同时期的产物。@PostConstruct,是一种通过 注解 来初始化的方法。init-method,是 xml 时代 的 初始化方法。但是!它们描述的都是同一件事情 “ 初始化 ”。

它们两个执行的优先级
        这么说吧:如果 两种方法,同时存在。
        先执行 @PostConstruct 注解的方法,然后执行 init-method 方法。
        原因更简单,我们是使用的是高版本的版本,过去的东西终究会被淘汰!

4、执行初始化的后置方法

4.使⽤ Bean
5.销毁 Bean

        销毁容器的各种方法,如 @PreDestroy,DisposableBean 接⼝⽅法,destroy-method
【 PS1:@PreDestroy 和 destroy-method 之间的关系,与 @PostConstruct 和 init-method 之间的关系,是一样的。】
【PS2:如果重写了 DisposableBean 接口方法,就会执行销毁 Bean】
【PS3:优先级:@PreDestroy > DisposableBean > destroy-method】

执⾏流程如下图所示:

好啦,本期结束啦,下期见~

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...