Bean作用域和生命周期

目录

一、Bean的作用域

1.1 Bean作用域的定义

1.2 Bean作用域的分类

1.3 如何设置Bean作用域

二、Bean的生命周期 

2.1 Spring的执行流程

2.2 Bean的生命周期


一、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")

Bean作用域和生命周期_第1张图片

(2) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Bean作用域和生命周期_第2张图片

二、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。

你可能感兴趣的:(java,spring)