目录
一、Bean的作用域
1.1 Bean作用域的定义
限定程序中变量的可作用范围叫做作用域;
而Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如单例作用域模式,就是指Bean对象在整个Spring中只有一份,当A修改Bean对象后,B读取到的Bean对象就是修改后的Bean。
1.2 Bean作用域的分类
Spring在初始化一个Bean对象的同时,会指定它的作用域。Spring有6种作用域,后4种是基于Spring MVC生效的。
(1) singleton:单例作用域
描述:该作用域下的Bean在Spring中只存在一个实例,Spring默认情况是单例作用域。
场景:当Bean对象的属性状态不需要更新时(无状态)使用该作用域。
(2) prototype:原型作用域(多例作用域)
描述:相对于单例作用域,每次对该作用域下的Bean对象的请求都会创建新的实例。
场景:适用于有状态的Bean。
(3) request:请求作用域
描述:每次http请求会创建新的Bean的实例。
场景:一次http请求和响应的共享Bean。
(4) session:会话作用域
描述:每个会话会创建新的Bean的实例。
场景:用户会话的共享Bean,例如登录信息。
(5) application:全局作用域
描述:在一个http servlet context中创建一个Bean
场景:Web应用的上下文信息,例如一个应用的共享信息。
(6) websocket:HTTP WebSocket作用域
描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例。
场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀ 次初始化后,直到WebSocket结束都是同⼀个Bean。
单例作用域和全局作用域的区别:
(1) singleton是Spring Core中的作用域;application是Spring Web中的作用域。
(2) singleton作用于IoC容器;application作用于Servlet容器。
1.3 如何设置Bean作用域
使用@Scope注解就可以用来设置Bean的作用域,@Scope既可以修饰方法也可以修饰类,使用@Scope设置Bean作用域的两种方式:
(1) @Scope("prototype")
(2) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
二、Bean的生命周期
在认识Bean的生命周期之前,需要先了解Spring的执行流程:
2.1 Spring的执行流程
(1) 启动项目;
(2) 读取配置文件,初始化Bean;
a) 使用xml直接注册的Bean;
b) 配置Bean的根扫描路径。
(3) 把Bean对象存储到Spring中,通过类注解进行扫描和装配;
(4) 从Spring中读取Bean,装配到相应的类中。
2.2 Bean的生命周期
生命周期是指一个对象从诞生到销毁的整个生命过程。
Bean的生命周期分为以下5个部分:
(1) 实例化Bean
将字节码文件读取到内存中,为Bean分配内存空间。
(2) 设置属性
如果当前Bean对象所在的类中注入了其他的Bean,就要先实例化其他的Bean,才能继续进行当前Bean的初始化工作。
(3) 初始化Bean
a) 执行实现了各种Aware通知的方法,如BeanNameAware;
b) 执行初始化的前置方法;
c) 执行初始化方法(@PostConstruct、指定的init-method方法);
d) 执行初始化的后置方法。
(4) 使用Bean。
(5) 销毁Bean。