不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛(下)

简介: 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛(下)

ApplicationStartedEvent:应用成功启动


@since 2.0.0。截止到此,应用已经准备就绪,并且通过监听器、初始化器等完成了非常多的工作了,但仍旧剩下被认为最为重要的初始化单例Bean动作还没做、web容器(如Tomcat)还没启动,这便是这个周期所要做的事。

完成的大事记


  • 启动Spring容器:AbstractApplicationContext#refresh(),这个步骤会做很多事,比如会实例化单例Bean
  • 该步骤属于Spring Framework的核心内容范畴,做了很多事,请参考Spring核心技术内容章节
  • 在Spring容器refresh()启动完成后,WebServer也随之完成启动,成功监听到对应端口(们)
  • 输出启动成功的日志:Started Application in xxx seconds (JVM running for xxx)
  • 发送ApplicationStartedEvent事件,触发对应的监听器的执行
  • callRunners():依次执行容器内配置的ApplicationRunner/CommandLineRunner的Bean实现类,支持sort排序
  • ApplicationRunner:@since 1.3.0,入参是ApplicationArguments,先执行(推荐使用)
  • CommandLineRunner:@since 1.0.0,入参是String... args,后执行(不推荐使用)


监听此事件的监听器们


默认情况下,有3个监听器监听ApplicationStartedEvent事件:


image.png


  1. 前两个不用再解释了吧:本事件达到时无动作
  2. TomcatMetricsBinder:@since 2.1.0。和监控相关:将你的tomcat指标信息TomcatMetrics绑定到MeterRegistry,从而就能收集到相关指标了


总结:此事件节点结束时,SpringApplication的生命周期到这一步,正常的启动流程就全部完成了。也就说Spring Boot应用可以正常对对外提供服务了。

ApplicationReadyEvent:应用已准备好


@since 1.3.0。该事件所处的生命周期可认为基本同ApplicationStartedEvent,仅是在其后执行而已,两者中间并无其它特别的动作,但是监听此事件的监听器们还是蛮重要的。


完成的大事记


同上。


监听此事件的监听器们


默认情况下,有4个监听器监听ApplicationStartedEvent事件:


image.png


  1. SpringApplicationAdminMXBeanRegistrar:当此事件到达时,告诉Admin Spring应用已经ready,可以使用啦。
  2. 中间这两个不用再解释了吧:本事件达到时无动作
  3. RefreshEventListener:当此事件到达时,告诉Spring应用已经ready了,接下来便可以执行ContextRefresher.refresh()喽


总结:此事件节点结束时,应用已经完完全全的准备好了,并且也已经完成了相关组件的周知工作。

异常情况


SpringApplication是有可能在启动的时候失败(如端口号已被占用),当然任何一步骤遇到异常时交给SpringApplication#handleRunFailure()方法来处理,这时候也会有对应的事件发出。

ApplicationFailedEvent:应用启动失败


当SpringApplication在启动时抛出异常:可能是端口绑定、也可能是你自定义的监听器你写了个bug等,就会“可能”发送此事件。


完成的大事记


  • 得到异常的退出码ExitCode,然后发送ExitCodeEvent事件(非生命周期事件)
  • 发送ApplicationFailedEvent事件,触发对应的监听器的执行


监听此事件的监听器们

默认情况下,有6个监听器监听ApplicationStartedEvent事件:


image.png



  1. LoggingApplicationListener:执行loggingSystem.cleanUp()清理资源
  2. ClasspathLoggingApplicationListener:输出一句debug日志:Application failed to start with classpath: ...
  3. 中间这两个不用再解释了吧:本事件达到时无动作
  4. ConditionEvaluationReportLoggingListener:自动配置输出报告,输出错误日志呗:特别方便你查看和错误定位
  5. 不得不夸:SB对错误定位这块才真叫智能,比Spring Framework好用太多了
  6. BootstrapApplicationListener.CloseContextOnFailureApplicationListener:执行context.close()

总结:此事件节点结束时,会做一些释放资源的操作。一般情况下:我们并不需要监听到此事件


总结


关于SpringApplication的生命周期体系的介绍就到这了,相信通过此“万字长文”你能体会到A哥的用心。翻了翻市面上的相关文章,本文Almost可以保证是总结得最到位的,让你通过一文便可从大的方面基本掌握Spring Boot,这不管是你使用SB,还是后续自行扩展、精雕细琢SB,以及去深入了解Spring Cloud均由非常重要的意义,希望对你有帮助,谢谢你的三连。

相关文章
|
22天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
39 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
25天前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
61 1
|
28天前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
68 1
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
46 2
|
4月前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
98 11
|
3月前
|
Java Spring 供应链
Spring 框架事件发布与监听机制,如魔法风暴席卷软件世界,开启奇幻编程之旅!
【8月更文挑战第31天】《Spring框架中的事件发布与监听机制》介绍了Spring中如何利用事件发布与监听机制实现组件间的高效协作。这一机制像城市中的广播系统,事件发布者发送消息,监听器接收并响应。通过简单的示例代码,文章详细讲解了如何定义事件类、创建事件发布者与监听器,并确保组件间松散耦合,提升系统的可维护性和扩展性。掌握这一机制,如同拥有一把开启高效软件开发大门的钥匙。
45 0
|
3月前
|
前端开发 Java 开发者
|
3月前
|
Java Spring
Spring的Bean生命周期中@PostConstruct注解
【8月更文挑战第3天】在Spring框架中,`@PostConstruct`注解标示Bean初始化完成后立即执行的方法。它在依赖注入完成后调用,适用于资源加载、属性设置等初始化操作。若方法中抛出异常,可能影响Bean初始化。与之对应,`@PreDestroy`注解的方法则在Bean销毁前执行,用于资源释放。
122 0
|
4月前
|
存储 设计模式 Java
Spring Boot中的事件溯源模式
Spring Boot中的事件溯源模式
|
5月前
|
Java Linux 程序员
大事件后端项目36--------SpringBoot项目部署
大事件后端项目36--------SpringBoot项目部署