1、SpringBoot生命周期

SpringBoot应用的生命周期,整体上可以分为SpringApplication初始化阶段、SpringApplication运行阶段、SpringApplication结束阶段、SpringBoot应用退出四个阶段。

1.1、SpringApplication初始化阶段

SpringApplication初始化阶段可以分为SpringApplication构造阶段和SpringApplication配置阶段。初始化阶段以发布ApplicationStartingEvent事件为止。

  • SpringApplication构造阶段

通过SpringApplication构造方法或SpringApplicationBuilder构建SpringApplication对象的过程可以归纳为构造阶段。

  • SpringApplication配置阶段

SpringApplication对象创建之后,调用set或相关属性设置方法的操作可以归纳为配置阶段。

1.2、SpringApplication运行阶段

SpringApplication运行阶段又可以划分为SpringApplication准备阶段、ApplicationContext启动阶段(refreshContext)、ApplicationContext启动后阶段,以发布ApplicationStartedEvent事件为止。

  • SpringApplication准备阶段

从运行SpringApplication#run方法(发布ApplicationStartingEvent事件后)到SpringApplication#prepareContext方法(含)属于SpringApplication准备阶段。以发布ApplicationPreparedEvent事件为止。

  • ApplicationContext启动阶段

SpringApplication#refreshContext方法属于ApplicationContext启动阶段,以发布ContextRefreshedEvent事件为止。

  • ApplicationContext启动后阶段

从SpringApplication#afterRefresh到发布ApplicationStartedEvent事件为止。

1.3、SpringApplication结束阶段

从发布ApplicationStartedEvent事件(不含)开始到发布发布ApplicationReadyEvent事件或ApplicationFailedEvent为止。

1.4、SpringBoot应用退出阶段

从关闭应用上下文到调用SpringApplication#exit或SpringApplication#handlerFailure或抛出异常错误为止。

2、SpringBoot生命周期事件

2.1、SpringBoot事件 *

SpringBoot应用生命周期中的事件,都是通过EventPublishingRunListener对象来触发的。EventPublishingRunListener对象是SpringApplicationRunListener接口的实现类,定义在spring.factories文件中,通过Spring的扩展机制加载。SpringBoot应用生命周期事件共有8种,从启动引导类创建SpringApplication对象开始。

  • ApplicationStartingEvent应用开始启动事件

SpringApplication对象调用run方法后,首先会创建事件监听器,事件监听器创建完毕即立刻触发ApplicationStartingEvent事件,此时环境变量、应用上下文等所有东西都还没创建或准备。

  • ApplicationEnviromentPreparedEvent应用环境准备事件

系统变量(JAVA_HOME、CLASSPATH等)、系统属性(java.version等)以及命令行参数等加载和封装到环境变量environment后触发。application.yaml文件中的属性,此时正通过ConfigFileApplicationListener监听并触发此事件进行加载中,所以,如果应用自定义监听器监听ApplicationEnviromentPreparedEvent事件,想要在自定义监听器中获取application.yaml文件中的属性,需要注意自定义监听器要实现排序并且应该排在ConfigFileApplicationListener之后,否则有可能获取不到属性。

  • ApplicationContextInitializedEvent应用上下文初始化事件

此时应用上下文已经创建,在为应用上下文绑定环境变量(包括application.yaml文件中的属性),并且应用了SpringApplication创建时加载的初始化器,之后触发此事件。注意,目前发现,2.0.4版本中还没有实现此事件。

  • ApplicationPreparedEvent应用准备事件

命令行参数对象和banner对象以单例被注册到容器,bean定义覆盖、延迟初始化处理器等参数被设置到容器或应用上下文中,同时SpringApplication创建时设置的主要配置源也已经被加载解析,接着触发ApplicationPreparedEvent事件。注意,如果配置源是Java配置类(注解),此时Java配置类将被注册为bean定义,但还未开始解析注解背后的逻辑;而如果配置源是xml或package包,则将会加载解析或扫描配置源,解析或扫描到的bean定义将被注册到容器中。ApplicationPreparedEvent和前面的ApplicationContextInitializedEvent事件都是在准备应用上下文的阶段(SpringApplication#prepareContext方法中)被触发。

  • ApplicationStartedEvent应用已启动事件

应用上下文已经刷新,并且调用了刷新后方法(afterRefresh)后触发此事件。此时自动配置已经完成,即相关bean定义已经被加载到容器中并且实例化了所有单例bean,同时启动了内嵌的Web服务器。在触发此事件之前,会触发Spring的ContextRefreshedEvent上下文就绪事件。

  • ApplicationReadyEvent应用已就绪事件

即运行中的状态。在启动运行器ApplicationRunner和CommandLineRunner执行任务后触发此事件。此时SpringBoot应用已经可以接受请求对外提供服务了。

  • ApplicationFailedEvent应用运行失败事件

如果SpringBoot在启动过程中(不包括ApplicationStartingEvent事件和之前部分代码)发生错误或异常,将触发ApplicationFailedEvent事件。

  • AvailabilityChangeEvent可用性变更事件

AvailabilityChangeEvent事件用于在内部标识当前应用的状态,一共有两类。一类是生存状态,另外一类是服务状态,分别都有两种可标识的状态。生存状态包括正确启动、启动异常两种,服务状态包括接受请求、拒绝请求两种。在发布ApplicationStartedEvent事件同时,SpringBoot会发布AvailabilityChangeEvent的生存状态为正确启动;在发布ApplicationReadyEvent应用已就绪事件同时,SpringBoot会发布AvailabilityChangeEvent的服务状态为接受请求。

2.2、Spring事件

  • ContextRefreshedEvent上下文刷新事件/就绪事件

调用ApplicationContext#refresh方法触发

  • ContextStartedEvent上下文启动事件

调用ApplicationContext#start方法触发

  • ContextStoppedEvent上下文停止事件

调用ApplicationContext#stop方法触发

  • ContextClosedEvent上下文关闭事件

调用ApplicationContext#close方法触发

  • RequestHandledEvent请求已处理事件

SpringMVC中的事件

2.3、生命周期事件总结

SpringBoot中可以监听到Spring的事件,但事件源不同,SpringBoot中的事件源是SpringAppication对象,而Spring中的事件源则是具体的ApplicationContext对象。

在Spring中,自定义事件监听器,一般可以通过实现ApplicationListener接口或注解@EventListener,然后注册为bean来实现对Spring的全生命周期事件的监听。

在SpringBoot中,由于实现原理导致,使用注解@EventListener方式只能监听SpringBoot的部分生命周期事件;可以通过实现ApplicationListener接口,然后为SpringApplication对象添加或设置监听器,或使用Spring的扩展机制在META-INF/spring.factories中配置监听器的方式来实现对SpringBoot的全生命周期事件的监听。

3、bean的生命周期 *

通过阅读源码,可以了解到一个bean的多种创建方式及其(主要是指被容器管理的单例bean,其它的bean,容器无法管理)生命周期事件,还有就是Spring针对bean提供的非常丰富的扩展接口和属性配置,让开发人员可以在bean创建过程中实现自定义需求。

3.1、bean相关的接口和配置

  • InstantiationAwareBeanPostProcessor接口

实现并注册一个InstantiationAwareBeanPostProcessor处理器,可以实现对bean对象的创建和属性填充的自定义。其中的postProcessBeforeInstantiation方法可以自行创建代理对象返回,在填充属性时,会新先调用postProcessAfterInstantiation方法(返回true或false)确认是否需要进行属性的填抽,如果返回 true,将继续进行属性填抽,并调用postProcessProperties或postProcessPropertyValues获取需要用来填充的属性。

  • bean的创建方式:FactoryBean、factory-method、构造方法、Supplier

除了new之外,可以使用FactoryBean创建bean,也可以指定工厂方法factory-method来创建bean,可以通过无参构造方法创建bean,也可以使用有参构造方法创建bean,还可以提供创建提供者Supplier来创建bean。

  • MergedBeanDefinitionPostProcessor接口

实现并注册一个MergedBeanDefinitionPostProcessor处理器,可以在bean创建后修改bean定义信息,以改变接下来属性填充或初始化等后续行为,比如修改初始化方法等

  • BeanNameAware接口

调用afterPropertiesSet或init-method方法前注入bean的名字

  • BeanClassLoaderAware接口

调用afterPropertiesSet或init-method方法前注入加载bean的类加载器

  • BeanFactoryAware接口

调用afterPropertiesSet或init-method方法前注入当前上下文的BeanFactory

  • BeanPostProcessor接口

实现并注册一个BeanPostProcessor处理器,实现对bean对象初始化前和初始化后对bean进行修改。在调用afterPropertiesSet或init-method方法之前,Spring会调用BeanPostProcessor处理器的postProcessBeforeInitialization方法,可以对bean进行修改;在调用afterPropertiesSet或init-method方法之后,Spring也会调用其postProcessAfterInitialization方法,可以对bean进行修改。

在Spring上下文中,有一个ApplicationContextAwareProcessor处理器在刷新应用上下文(prepareBeanFactory方法)时被注册到应用上下文中,它只实现了BeanPostProcessor接口的postProcessBeforeInitialization方法,其内部代理了对实现以下6个接口的bean注入需要的对象,这6个接口分别是EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware。

  • InitializingBean接口

用于初始化bean,在bean初始化步骤时调用afterPropertiesSet方法

  • init-method属性

该属性可以指定bean的初始化方法,在afterPropertiesSet之后调用

  • DestructionAwareBeanPostProcessor接口

bean销毁前,有条件调用postProcessBeforeDestruction方法进行现场清理

  • DisposableBean接口

bean销毁时,将调用bean的destroy方法

  • destroy-method属性

bean销毁时,将调用destroy-method属性指定的bean方法

  • SmartInitializingSingleton接口

可以在所有单例bean初始化后,再进行一次初始化的机会。实现该接口的bean,Spring在初始化所有单例bean后,调用bean的afterSingletonsInstantiated方法。

  • SmartInstantiationAwareBeanPostProcessor接口

SmartInstantiationAwareBeanPostProcessor接口一般用在bean循环依赖的场景,当一个bean使用到另一个提前曝光的bean的时候调用。调用时间在Spring解决循环引用的情形下触发。

3.2、bean的生命周期流程

想了解SpringBoot应用的启动流程可参考SpringBoot应用启动流程简介

SpringBoot生命周期相关推荐

  1. springboot 生命周期

    一.springboot生命周期 1.初始化环境变量 2.初始化环境变量完成 3.应用启动 4.应用已启动完成 5.应用刷新 6.应用停止 7.应用关闭 二.springboot生命周期监控 1.ap ...

  2. 秒懂SpringBoot之Spring对象生命周期与扩展点浅尝辄止

    [版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 文章目录 概述 Bean的生命周期 感受Bean生命周期 具体说明 扩展点 容器级扩展点 对象级扩展点 多一点 总结 概述 I ...

  3. SpringBoot:Bean生命周期介绍

    SpringBoot:Bean生命周期介绍 前言 一.Bean 的生命周期介绍 二.具体操作顺序 前言 Bean 是 SpringBoot 中一个非常重要的组成部分,是面试中经常会问到的一个问题. 本 ...

  4. springboot bean生命周期

    对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制. Spring IoC容器托管对象的be ...

  5. springboot学习:bean生命周期

    1.bean 生命周期 bean创建-初始化-销毁 构造(对象创建): 单实例:在容器启动的时候创建对象; 多实例:在每次获取的时候创建对象: 初始化: 对象创建完成,并赋值好,调用初始化方法 销毁: ...

  6. SpringBoot 系列教程(五十):Spring Boot 1.X生命周期已结束 ,Spring Boot 2.X 走向舞台中心

    Spring Boot 1.x 生命周期已结束 2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束. 官方宣 ...

  7. Elasticsearch索引生命周期管理方案

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.前言 在 Elasticsearch 的日常中,有很多 ...

  8. Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:撸码识途 jianshu.com/p/70b935f2b3f ...

  9. Spring核心——Bean的生命周期

    文章目录 序言 一:Bean生命周期流程图 二:测试方法以及步骤 1.创建一个bean 2.创建BeanFactoryPostProcessor 的实现实例 3.创建InstantiationAwar ...

  10. 生命周期结束,Spring Boot 1.x退役

    一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束,如今时间已到,在发布 Spring Boot 1.5.22 的同时,Spring 确认将不再为 1 ...

最新文章

  1. 零点起飞学mysql视频_零点起飞学MySQL
  2. jstatd - Virtual Machine jstat Daemon
  3. LOL手游最能混分的英雄,前期刷野靠队友,迪丽阿巴亲自教学
  4. 并发环境下,先操作数据库还是先操作缓存?
  5. SAP Spartacus取语言设置的入口程序
  6. python中用于标识字符串的定界符_Python 基本数据类型
  7. 联想g470笔记本开vt_最“发泄”评测!飞刀铁拳暴力输出,联想本结局竟然大亮?(附视频)...
  8. html css 走马灯,纯css 实现跑马灯效果
  9. centos7设置静态IP地址
  10. ORM Model查询页生成
  11. C++ tbb::atomic
  12. MFC中的几个虚函数
  13. error CS1010 CS8025 CS1012 CS1525 常见文档错误解决
  14. 《深度卷积神经网络原理与实践》笔记 第二、三章 卷积神经网络原理及典型结构
  15. 牛客网刷题——JAVA
  16. Wampserver图标是橙色的【问题与解决方案】
  17. 移动互联网草根狂欢:三四线城镇用户价值凸显
  18. clickhouse 报错 “Unmatched parentheses: (“ 或者报错 “Expected one of: CODEC, NULL, ALIAS, TTL, ClosingR
  19. 运维工程师是桥的护栏_海沧大桥护栏救过不少车 揭秘护栏是如何养护的
  20. 用对这30种秘密武器, 你也能成为区块链高手!

热门文章

  1. 荒野大镖客2显示服务器离线,《荒野大镖客2》PC版进入离线模式方法
  2. OSChina 周六乱弹 ——什么是村支书不可推卸的责任!
  3. Processing绘制星空-2-绘制流星
  4. LINQ 语句中Take() 和Skip() 总结
  5. zookeeper选举机制详解
  6. Logstash 中type 和 tags
  7. QScrollArea的简单使用
  8. 低配置享受3D立体游戏 手把手教你设置
  9. Duplicate entry '0' for key 'PRIMARY' 分析及其解决办法
  10. Activity实战之装备购买小案例