持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
生命周期
Bean 在 Spring(IOC)中从创建到销毁的整个过程。Spring 中 Bean 的生命周期主要包含以下5部分:
-
实例化:为 Bean 分配内存空间;
-
设置属性:将当前类依赖的 Bean 属性,进行注入和装配;
-
初始化:
1.执行各种通知
2.执行初始化的前置方法
3.执行初始化方法
4.执行初始化的后置方法
-
使用 Bean:在程序中使用 Bean 对象
-
销毁Bean:将 Bean 对象进行销毁操作。
注意:“实例化”和“初始化”是两个完全不同的过程,实例化只是给Bean 分配了内存空间,而初始化则是将程序的执行权,从系统级别转换到用户级别,并开始执行用户添加的业务代码。
作用域
Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值。
分类
在 Spring 中,Bean 的常见作用域有以下 5 种:
- singleton:单例作用域;
- prototype:原型作用域(多例作用域);
- request:请求作用域;
- session:会话作用域;
- application:全局作用域。
单例-singleton
该作用域下的 Bean 在 IoC 容器中只存在一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象
通常无状态的 Bean 使用该作用域,表示该 Bean 对象的属性状态不需要更新
Spring默认选择该作用域
原型-prototype
每次对该作用域下的 Bean 的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。
通常有状态的 Bean 使用该作用域。
请求-request
每次 Http 请求会创建新的 Bean 实例,类似于 prototype。
一次 Http 的请求和响应的共享 Bean。
限定 Spring MVC 框架中使用。
会话-session
在一个 Http Session 中,定义一个 Bean 实例。
用户会话的共享 Bean, 比如:记录一个用户的登陆信息。
限定 Spring MVC 框架中使用。
全局-application
在一个 Http Servlet Context 中,定义一个 Bean 实例。
Web 应用的上下文信息,比如:记录一个应用的共享信息。
限定 Spring MVC 框架中使用。
作用域设置
通过 @Scope 注解来设置 Bean 的作用域,设置方式有以下两种:
1.直接设置 :@Scope("prototype")
2.设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)