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】
执⾏流程如下图所示:
好啦,本期结束啦,下期见~