Spring Bean声明周期和作用域

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

生命周期

Bean 在 Spring(IOC)中从创建到销毁的整个过程。Spring 中 Bean 的生命周期主要包含以下5部分:

  1. 实例化:为 Bean 分配内存空间;

  2. 设置属性:将当前类依赖的 Bean 属性,进行注入和装配;

  3. 初始化:

    1.执行各种通知

    2.执行初始化的前置方法

    3.执行初始化方法

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

  4. 使用 Bean:在程序中使用 Bean 对象

  5. 销毁Bean:将 Bean 对象进行销毁操作。

注意:“实例化”和“初始化”是两个完全不同的过程,实例化只是给Bean 分配了内存空间,而初始化则是将程序的执行权,从系统级别转换到用户级别,并开始执行用户添加的业务代码

作用域

Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值。

分类

在 Spring 中,Bean 的常见作用域有以下 5 种:

  1. singleton:单例作用域;
  2. prototype:原型作用域(多例作用域);
  3. request:请求作用域;
  4. session:会话作用域;
  5. 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)