自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Boot 啟動事件和監(jiān)聽器,太強(qiáng)大了!

安全 應(yīng)用安全
大家都知道,在 Spring 框架中事件和監(jiān)聽無處不在,打通了 Spring 框架的任督二脈,事件和監(jiān)聽也是 Spring 框架必學(xué)的核心知識之一。

[[357745]]

大家都知道,在 Spring 框架中事件和監(jiān)聽無處不在,打通了 Spring 框架的任督二脈,事件和監(jiān)聽也是 Spring 框架必學(xué)的核心知識之一。

一般來說,我們很少會使用到應(yīng)用程序事件,但我們也不要忘了它們的存在,比如說在 Spring 框架內(nèi)部都使用了各種不同的事件來處理不同的任務(wù)。

毫無疑問,在 Spring Boot 框架中,事件和監(jiān)聽也得到了發(fā)揚光大,除了常用的 Spring Framework 事件(例如:ContextRefreshedEvent)之外,Spring Boot 在啟動過程中還發(fā)送一系列其他的應(yīng)用程序事件。

Spring Boot 啟動事件順序

1、ApplicationStartingEvent

這個事件在 Spring Boot 應(yīng)用運行開始時,且進(jìn)行任何處理之前發(fā)送(除了監(jiān)聽器和初始化器注冊之外)。

2、ApplicationEnvironmentPreparedEvent

這個事件在當(dāng)已知要在上下文中使用 Spring 環(huán)境(Environment)時,在 Spring 上下文(context)創(chuàng)建之前發(fā)送。

3、ApplicationContextInitializedEvent

這個事件在當(dāng) Spring 應(yīng)用上下文(ApplicationContext)準(zhǔn)備好了,并且應(yīng)用初始化器(ApplicationContextInitializers)已經(jīng)被調(diào)用,在 bean 的定義(bean definitions)被加載之前發(fā)送。

4、ApplicationPreparedEvent

這個事件是在 Spring 上下文(context)刷新之前,且在 bean 的定義(bean definitions)被加載之后發(fā)送。

5、ApplicationStartedEvent

這個事件是在 Spring 上下文(context)刷新之后,且在 application/ command-line runners 被調(diào)用之前發(fā)送。

6、AvailabilityChangeEvent

這個事件緊隨上個事件之后發(fā)送,狀態(tài):ReadinessState.CORRECT,表示應(yīng)用已處于活動狀態(tài)。

7、ApplicationReadyEvent

這個事件在任何 application/ command-line runners 調(diào)用之后發(fā)送。

8、AvailabilityChangeEvent

這個事件緊隨上個事件之后發(fā)送,狀態(tài):ReadinessState.ACCEPTING_TRAFFIC,表示應(yīng)用可以開始準(zhǔn)備接收請求了。

9、ApplicationFailedEvent

這個事件在應(yīng)用啟動異常時進(jìn)行發(fā)送。

上面所介紹的這些事件列表僅包括綁定到 SpringApplication 的 SpringApplicationEvents 事件,除了這些事件以外,以下事件也會在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前發(fā)送:

  • WebServerInitializedEvent

這個 Web 服務(wù)器初始化事件在 WebServer 啟動之后發(fā)送,對應(yīng)的還有 ServletWebServerInitializedEvent(Servlet Web 服務(wù)器初始化事件)、ReactiveWebServerInitializedEvent(響應(yīng)式 Web 服務(wù)器初始化事件)。

  • ContextRefreshedEvent

這個上下文刷新事件是在 Spring 應(yīng)用上下文(ApplicationContext)刷新之后發(fā)送。

自定義啟動事件監(jiān)聽器

既然我們知道了 Spring Boot 在啟動過程中的各個事件,那么我們就可以在每個環(huán)節(jié)來處理一些我們想做的事情,只需要自定義一個監(jiān)聽器來監(jiān)聽某個事件就可以了。

比如我們想在上面的第 8 步,即應(yīng)用啟動完成可以接收請求了,我們簡單輸出一個成功標(biāo)識。

Spring Boot 基礎(chǔ)的構(gòu)建這里就不介紹了,如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學(xué)習(xí)下吧,推薦這個 Spring Boot 學(xué)習(xí)倉庫,歡迎 Star 關(guān)注:

https://github.com/javastacks/spring-boot-best-practice

1、新建監(jiān)聽器

  1. import lombok.extern.slf4j.Slf4j; 
  2. import org.springframework.boot.availability.AvailabilityChangeEvent; 
  3. import org.springframework.boot.availability.ReadinessState; 
  4. import org.springframework.context.ApplicationListener; 
  5.  
  6. /** 
  7.  * 來源微信公眾號:Java技術(shù)棧 
  8.  */ 
  9. @Slf4j 
  10. public class JavastackListener implements ApplicationListener<AvailabilityChangeEvent> { 
  11.  
  12.     @Override 
  13.     public void onApplicationEvent(AvailabilityChangeEvent event) { 
  14.         log.info("監(jiān)聽到事件:" + event); 
  15.         if (ReadinessState.ACCEPTING_TRAFFIC == event.getState()){ 
  16.             log.info("應(yīng)用啟動完成,可以請求了……"); 
  17.         } 
  18.     } 
  19.  

新建一個自定義監(jiān)聽器,實現(xiàn)了 ApplicationListener 接口,泛型 AvailabilityChangeEvent 表示僅僅監(jiān)聽 AvailabilityChangeEvent 事件。

因第 8 步的事件和第 6 步的事件同名,我們可以根據(jù)事件的狀態(tài)來區(qū)分到底是哪一個環(huán)節(jié)的事件 。

2、注冊監(jiān)聽器

注冊監(jiān)聽器有兩種方式:

1、在資源目錄中的 META-INF/spring.factories 文件中自動注冊:

  1. org.springframework.context.ApplicationListener=\ 
  2. cn.javastack.springboot.features.listener.JavastackListener 

2、如果是監(jiān)聽 Spring 應(yīng)用上下文(ApplicationContext)創(chuàng)建之后的事件,可以直接在監(jiān)聽器上使用 @Component 注解即可,否則需要使用第一種方法的自動注冊,因為 ApplicationContext 并未創(chuàng)建,這時的 Bean 是不能被加載的。

3、應(yīng)用啟動

下面來看下啟動日志:

可以看到同時輸出了第 6 步和 8 步的監(jiān)聽日志,但只輸出第 8 步的啟動完成日志,自定義監(jiān)聽實現(xiàn)成功。

總結(jié)

了解了 Spring Boot 啟動過程中的各個事件及監(jiān)聽機(jī)制,大家可以依葫蘆畫瓢實現(xiàn) Spring Boot 啟動過程中的各個自定義操作,比如說在啟動過程上實現(xiàn)動態(tài)注冊、移除 Bean 等。

一般來說,不建議使用事件和監(jiān)聽器來實現(xiàn)比較耗時和繁重的任務(wù),這樣會影響應(yīng)用程序的正常啟動,考慮使用 Spring Boot 的 application/ command-line runners 來進(jìn)行實現(xiàn)。

本文只是介紹了一下 Spring Boot 啟動過程中的事件及如何實現(xiàn)自定義監(jiān)聽器,怎么實現(xiàn)一個業(yè)務(wù)上的自定義事件和監(jiān)聽器不在本文范圍之類,后續(xù)棧長再開一篇,關(guān)注公眾號Java技術(shù)棧第一時間推送,不要走開。

本文實踐所有源代碼已上傳:

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

本文轉(zhuǎn)載自微信公眾號「 Java技術(shù)棧」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 Java技術(shù)棧公眾號。

 

責(zé)任編輯:武曉燕 來源: Java技術(shù)棧
相關(guān)推薦

2023-11-01 07:55:03

事件監(jiān)聽器傳遞數(shù)據(jù)

2010-08-09 09:47:34

Flex事件機(jī)制

2009-06-22 09:23:18

事件監(jiān)聽器

2009-07-17 09:55:02

事件監(jiān)聽器SWT和SwingAWT

2012-02-03 13:27:16

2010-08-09 11:06:01

Flex事件機(jī)制

2021-07-08 07:52:49

容器監(jiān)聽器Event

2024-04-23 08:19:48

2011-03-21 16:21:49

Oracle監(jiān)聽口令監(jiān)聽器

2022-11-16 08:33:29

監(jiān)聽Spring監(jiān)聽器

2009-07-08 17:39:23

Servlet監(jiān)聽器

2009-09-27 17:46:22

Hibernate監(jiān)聽

2025-01-13 13:47:13

2011-05-16 10:14:11

Hibernate

2021-07-19 09:42:45

Spring Boot@ValueJava

2023-11-01 08:22:07

Spring發(fā)布器源對象

2020-12-10 10:00:59

監(jiān)控Java可視化

2009-11-09 10:03:09

WCF通道監(jiān)聽器

2010-02-22 15:06:31

WCF信道監(jiān)聽器

2023-01-06 08:55:00

點贊
收藏

51CTO技術(shù)棧公眾號