我们都知道,在 Spring 框架中事件和监视无所不在,连通了 Spring 框架的任督二脉,事件和监视也是 Spring 框架必备的关键专业知识之一。
一般来说,大家非常少会应用到应用软件事件,但咱们也不能忘记了他们的存有,例如在 Spring 框架内部结构都采用了多种不一样的事件来解决差异的每日任务。
不容置疑,在 Spring Boot 框架中,事件和监视也取得了发扬,除开常见的 Spring Framework 事件(例如:ContextRefreshedEvent)以外,Spring Boot 在运行全过程中还发送一系列别的的应用软件事件。
Spring Boot 运行事件次序
1、ApplicationStartingEvent
这一事件在 Spring Boot 运用运作逐渐时,且开展其他解决以前发送(除开监听器和复位器申请注册以外)。
2、ApplicationEnvironmentPreparedEvent
这一事件在当已经知道要在前后文中应用 Spring 自然环境(Environment)时,在 Spring 前后文(context)建立以前发送。
3、ApplicationContextInitializedEvent
这一事件在当 Spring 运用前后文(ApplicationContext)做好准备,而且运用复位器(ApplicationContextInitializers)早已被启用,在 bean 的界定(bean definitions)被载入以前发送。
4、ApplicationPreparedEvent
这一事件是在 Spring 前后文(context)刷新之前,且在 bean 的界定(bean definitions)被载入以后发送。
5、ApplicationStartedEvent
这一事件是在 Spring 前后文(context)更新以后,且在 application/ command-line runners 被启用以前发送。
6、AvailabilityChangeEvent
这一事件紧跟上一个事件以后发送,情况:ReadinessState.CORRECT,表明运用已处在激活状态。
7、ApplicationReadyEvent
这一事件在一切 application/ command-line runners 启用以后发送。
8、AvailabilityChangeEvent
这一事件紧跟上一个事件以后发送,情况:ReadinessState.ACCEPTING_TRAFFIC,表明运用可以逐渐打算接受要求了。
9、ApplicationFailedEvent
这一事件在运用运行出现异常时开展发送。
上边所介紹的这种事件目录仅包含关联到 SpringApplication 的 SpringApplicationEvents 事件,除开这种事件之外,下列事件也会在 ApplicationPreparedEvent 以后和 ApplicationStartedEvent 以前发送:
- WebServerInitializedEvent
这一 Web 网络服务器复位事件在 WebServer 运行以后发送,相匹配的也有 ServletWebServerInitializedEvent(Servlet Web 网络服务器复位事件)、ReactiveWebServerInitializedEvent(响应式网站 Web 网络服务器复位事件)。
- ContextRefreshedEvent
这一前后文更新事件是在 Spring 运用前后文(ApplicationContext)更新以后发送。
自定运行事件监听器
即然大家知道 Spring Boot 在运行流程中的每个事件,那麼大家就可以在每一个阶段来解决一些大家想要做的事儿,只必须自定一个监听器来监视某一事件就可以了。
例如大家想在上面的第 8 步,即运用运行进行可以接受要求了,大家简易輸出一个取得成功标志。
Spring Boot 基本的搭建这儿也不详细介绍了,假如你对 Spring Boot 还没有很了解,或是仅仅会简易的应用,那或是提议你认真贯彻一下吧,强烈推荐这一 Spring Boot 学习培训库房,热烈欢迎 Star 关心:
https://github.com/javastacks/spring-boot-best-practice
1、新创建监听器
新创建一个自定监听器,完成了 ApplicationListener 插口,泛型 AvailabilityChangeEvent 表明只是监视 AvailabilityChangeEvent 事件。
因第 8 步的事件和第 6 步的事件同名的,我们可以依据事件的情况来区别到底是哪一个阶段的事件 。
2、申请注册监听器
注册监听器有这两种方法:
1、在資源文件目录中的 META-INF/spring.factories 文档中全自动申请注册:
2、如果是监视 Spring 运用前后文(ApplicationContext)建立以后的事件,可以同时在监听器上应用 @Component 注释就可以,不然必须应用第一种方式的全自动申请注册,由于 ApplicationContext 并没有建立,这时的 Bean 是不可以被载入的。
3、运用运行
下边看来下运行日志:
能够看见与此同时輸出了第 6 步和 8 步的监视日志,但只輸出第 8 步的运行进行日志,自定监视完成取得成功。
汇总
了解了 Spring Boot 运行流程中的每个事件及监视体制,大伙儿可以生搬硬套完成 Spring Boot 运行流程中的每个自定实际操作,例如在运行全过程上完成动态性申请注册、清除 Bean 等。
一般来说,不建议应用事件和监听器来完成较为用时和繁琐的每日任务,那样会危害应用软件的常规运行,考虑到应用 Spring Boot 的 application/ command-line runners 来实现完成。
文中就是详细介绍了一下 Spring Boot 运行流程中的事件及怎样完成自定监听器,如何完成一个业务流程上的自定事件和监听器没有在文中范畴之类,后面栈长再开一篇,扫码关注Java技术栈第一时间消息推送,不必离开。
文中实践活动全部源码已提交:
https://github.com/javastacks/spring-boot-best-practice
参考资料:
https://docs.spring.io/spring-boot/docs/2.3.5.RELEASE/reference/htmlsingle/#boot-features-application-events-and-listeners
文中转载自微信公众号「 Java技术栈」,可以利用下列二维码关注。转截文中请联络 Java技术栈微信公众号。