1. 程式人生 > >springboot原始碼分析16-spring boot監聽器使用

springboot原始碼分析16-spring boot監聽器使用

摘要:spring boot提供了一系列的監聽器,方便我們開發人員使用和擴充套件。

本文咱們詳細講解一下spring boot中的監聽器。

spring boot中支援的事件型別定在org.springframework.boot.context.event包中,目前支援的事件型別有如下6種:

ApplicationFailedEvent

ApplicationPreparedEvent

ApplicationReadyEvent

ApplicationStartedEventSpringboot2.x版本已修改為ApplicationStartingEvent

SpringApplicationEvent

ApplicationEnvironmentPreparedEvent

1.1. 監聽器的使用

第一:首先定義一個自己使用的監聽器類並實現ApplicationListener介面。

第二:通過SpringApplication類中的addListeners方法將自定義的監聽器註冊進去。

1.1.1. ApplicationFailedEvent

ApplicationFailedEvent:該事件為spring boot啟動失敗時的操作。

/**

* spring boot 啟動的時候出現異常事件

* @author www.shareniu.com

*

*/

public class ShareniuApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {

@Override

public void onApplicationEvent(ApplicationFailedEvent event) {

System.out.println("--------------:ShareniuApplicationFailedEventListener");

Throwable exception = event.getException();

System.out.println(exception);

}

}

可以通過ApplicationFailedEvent 獲取Throwable例項物件獲取異常資訊並處理。

1.1.2. ApplicationPreparedEvent

ApplicationPreparedEvent:上下文準備事件。

上下文context已經準備完畢 ,可以通過ApplicationPreparedEvent獲取到ConfigurableApplicationContext例項物件。ConfigurableApplicationContext類繼承ApplicationContext類,但需要注意這個時候spring容器中的bean還沒有被完全的載入,因此如果通過ConfigurableApplicationContext獲取bean會報錯的。比如報錯:

Exception in thread "main" java.lang.IllegalStateException: org.springframework.boot[email protected]69b0fd6f has not been refreshed yet

獲取到上下文之後,可以將其注入到其他類中,畢竟ConfigurableApplicationContext為引用型別。

public class ShareniuApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent> {

@Override

public void onApplicationEvent(ApplicationPreparedEvent event) {

System.out.println("###############"+"ShareniuApplicationPreparedEventListener");

ConfigurableApplicationContext applicationContext = event.getApplicationContext();

//如果執行下面程式碼則報錯

//ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);

//System.out.println(shareniuDemo);

}

}

1.1.3. ApplicationReadyEvent

ApplicationReadyEvent:上下文已經準備ok

這個時候就可以通過ApplicationReadyEvent獲取ConfigurableApplicationContext,然後通過ConfigurableApplicationContext 獲取bean的資訊。

public class ShareniuApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {

@Override

public void onApplicationEvent(ApplicationReadyEvent event) {

System.out.println("--------------------:ShareniuApplicationReadyEventListener");

ConfigurableApplicationContext applicationContext = event.getApplicationContext();

    //ShareniuDemo可以根基自身情況進行測試

ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);

}

}

1.1.4. ApplicationStartedEvent

ApplicationStartedEventspring boot 啟動監聽類。該類在SpringBoot2.x版本中已經廢棄,修改為了最新的類,類名是ApplicationStartingEvent。這個事件是第一個產生的。

可以在SpringApplication啟動之前做一些手腳,比如修改SpringApplication例項物件中的屬性值。

public class ShareniuApplicationStartedEventListener  implements ApplicationListener<ApplicationStartedEvent>{

@Override

public void onApplicationEvent(ApplicationStartedEvent event) {

SpringApplication springApplication = event.getSpringApplication();

springApplication.setShowBanner(false);

System.out.println("##############################ShareniuApplicationStartedEventListener");

}

}

1.1.5. SpringApplicationEvent

SpringApplicationEvent:獲取SpringApplication

public class ShareniuSpringApplicationEventListener implements ApplicationListener<SpringApplicationEvent> {

@Override

public void onApplicationEvent(SpringApplicationEvent event) {

System.out.println("-----------------------:ShareniuSpringApplicationEventListener");

SpringApplication springApplication = event.getSpringApplication();

System.out.println("###############"+springApplication);

}

}

1.1.6. ApplicationEnvironmentPreparedEvent

ApplicationEnvironmentPreparedEvent:環境事先準備,spring boot中的環境已經準備ok

可以通過ApplicationEnvironmentPreparedEvent獲取到SpringApplicationConfigurableEnvironment等等資訊, 可以通過ConfigurableEnvironment例項物件來修改以及獲取預設的環境資訊。

public class ShasreniuApplicationEnvironmentPreparedEventListener  implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{

@Override

public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {

System.out.println("###############"+"ShasreniuApplicationEnvironmentPreparedEventListener");

SpringApplication springApplication = event.getSpringApplication();

ConfigurableEnvironment environment = event.getEnvironment();

long timestamp = event.getTimestamp();

Object source = event.getSource();

System.out.println("########################"+springApplication);

System.out.println("########################"+environment);

System.out.println("########################"+timestamp);

System.out.println("########################"+source);

MutablePropertySources propertySources = environment.getPropertySources();

if (propertySources!=null) {

Iterator<PropertySource<?>> iterator = propertySources.iterator();

while (iterator.hasNext()) {

PropertySource<?> propertySource = (PropertySource<?>) iterator.next();

System.out.println("##############:propertySource"+propertySource);

}

}

 }

}

1.2. 監聽器註冊

@RestController

@SpringBootApplication()

public class Application {

@RequestMapping("/")

String index() {

return "xxxxxxxxxxxxx";

}

public static void main(String[] args) {

SpringApplication springApplication = new SpringApplication(Application.class);

springApplication.addListeners(new ShareniuApplicationStartedEventListener());

springApplication.addListeners(new ShasreniuApplicationEnvironmentPreparedEventListener());

springApplication.addListeners(new ShareniuApplicationPreparedEventListener());

springApplication.addListeners(new ShareniuApplicationFailedEventListener());

springApplication.addListeners(new ShareniuApplicationReadyEventListener());

springApplication.addListeners(new ShareniuSpringApplicationEventListener());

springApplication.run(args);

}

}

歡迎關注我的微信公眾號,第一時間獲得部落格更新提醒,以及更多成體系的Java相關原創技術乾貨。 
掃一掃下方二維碼或者長按識別二維碼,即可關注。
 


相關推薦

springboot原始碼分析16-spring boot監聽器使用

摘要:spring boot提供了一系列的監聽器,方便我們開發人員使用和擴充套件。本文咱們詳細講解一下spring boot中的監聽器。spring boot中支援的事件型別定在org.springfr

Springboot原始碼分析Spring迴圈依賴揭祕

摘要: 若你是一個有經驗的程式設計師,那你在開發中必然碰到過這種現象:事務不生效。或許剛說到這,有的小夥伴就會大驚失色了。Spring不是解決了迴圈依賴問題嗎,它是怎麼又會發生迴圈依賴的呢?,接下來就讓我們一起揭祕Spring迴圈依賴的最本質原因。 Spring迴圈依賴流程圖 Spring迴圈依賴發生原因

springboot原始碼分析14-事件釋出機制以及應用監聽器

摘要:事件驅動模型,也就是我們經常提到用到的觀察者模式。當然也可以將其理解為釋出-訂閱模型。具體的實現要素有如下幾個方面。1、首先是一對多的關係,一是目標物件,多則是觀察者物件。比如報社是一個,而訂報者

springboot(十一):Spring boot中mongodb的使用

gpo for 當前 window 公司 多表 erlang 大量 secondary mongodb是最早熱門非關系數據庫的之一,使用也比較普遍,一般會用做離線數據分析來使用,放到內網的居多。由於很多公司使用了雲服務,服務器默認都開放了外網地址,導致前一陣子大批 Mong

使用IDEA 中 實現springboot 熱部署 (spring boot devtools版)

apple convert lang start class tool 但是 原理 tty 第一步:添加springboot的配置文件 首先我先貼出我的配置 添加依賴包 <!-- spring boot devtools 依賴包. --> &

SpringBoot原始碼分析 配置檔案的載入原理和優先順序

從SpringBoot原始碼分析 配置檔案的載入原理和優先順序 本文從SpringBoot原始碼分析 配置檔案的載入原理和配置檔案的優先順序     跟入原始碼之前,先提一個問題:   SpringBoot 既可以載入指定目錄下的配置檔案獲取配置項,也可

帶著萌新看springboot原始碼8(spring ioc原始碼下)

  繼續接著上一節,到了第六步(溫馨提醒,內容有點小多,不過看完ioc原理就差不多了) 6.註冊Bean後置處理器(registerBeanPostProcessors(beanFactory))        最後一步,新增一個後置處理器,開啟這個後置處理器 &n

Spring5原始碼分析Spring

前言 因為本人打算仿照Spring寫個小型Spring–TinySpring,所以要閱讀Spring原始碼,在閱讀原始碼過程中的發現就記錄於此,如果有什麼錯誤,歡迎指出,我會及時更正。 正文 Disp

springboot】3、Spring Boot+Mybatis

依賴配置 結合前面的內容,這裡我們要嵌入資料庫的操作,這裡以操作mysql為例整合Mybatis,首先需要在原來的基礎上新增以下依賴 <!-- mybatis依賴 --> <dependency> <groupId>org.my

SpringBoot 專案報錯 spring boot Configuration Annotation Proessor not found in classpath

報錯spring boot Configuration Annotation Proessor not found in classpath 這是因為@ConfigurationProperties(prefix=”author”) 沒有指定classpath時,IDE

Spring-Cloud-Gateway原始碼分析系列| Spring-Cloud-Gateway初始化

推薦 Spring Boot/Cloud 視訊: Spring-Cloud專案使用EnableAutoConfiguration註解自動 初始化配置資訊,Spring-Cloud-Gateway同樣,Spring-Cloud-Gateway下的spring.f

Spring-Cloud-Gateway原始碼分析系列 | Spring-Cloud-Gateway之GatewayProperties初始化載入

推薦 Spring Boot/Cloud 視訊: 在Spring-Cloud-Gateway初始化時我們在GatewayAutoConfiguration配置中看到了有初始化載入GatewayProperties例項的配置,接下來學習下GatewayPrope

spring原始碼分析spring生命週期二

接著上一篇我們看看具體是哪裡的程式碼執行了。 1.初始化BeanFactoryPostProcessor invokeBeanFactoryPostProcessors(beanFactory);--> PostProcessorRegistrationDelegate.

spring原始碼分析spring生命週期

最近在看springboot自動配置,看到了@Conditional,@ConditionalOnMissingBean等等。這些註解,一直研究他們是如何實現springboot的條件註解的。由他們回到了@Configuration,回到了ConfigurationClassPostPr

Spring原始碼分析Spring中的後置處理器BeanPostProcessor

BeanPostProcessor簡介 BeanPostProcessor是Spring IOC容器給我們提供的一個擴充套件介面,如果我們需要在容器完成Bean的例項、初始化方法前後新增一些自己的邏輯處理,那麼定義一個BeanPostProcessor介面的實現類。

mybatis一個物件查詢流程簡單分析(整合spring boot)

<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifa

以太坊原始碼分析(16)挖礦分析

### 從交易扔到tx的pending池開始分析,不言而喻現在該是礦工登場的時候了/miner/miner.go/Start```func (self *Miner) Start(coinbase common.Address) {    atomic.StoreInt32(&self.shouldS

Spring原始碼分析4 — spring bean建立和初始化

1 介紹 建立並初始化spring容器中,refresh()方法中解析xml配置檔案,註冊容器後處理器,bean後處理器,初始化MessageSource,ApplicationEventMulticaster廣播器,註冊完ApplicationListene

極其簡單的 使用IDEA 中 實現springboot 熱部署 (spring boot devtools版)

新增配置pom.xml配置 第一步:新增springboot的配置檔案 首先我先貼出我的配置 新增依賴包 <!-- spring boot devtools 依賴包. --> <dependency>

spring原始碼分析spring-jdbc模組詳解

0 概述 Spring將替我們完成所有使用JDBC API進行開發的單調乏味的、底層細節處理工作。下表描述了哪些是spring幫助我們做好的,哪些是我們要做的。 Action  Spring  You Define connection parameters.  X