springboot原始碼分析16-spring boot監聽器使用
摘要:spring boot提供了一系列的監聽器,方便我們開發人員使用和擴充套件。
本文咱們詳細講解一下spring boot中的監聽器。
spring boot中支援的事件型別定在org.springframework.boot.context.event包中,目前支援的事件型別有如下6種:
ApplicationFailedEvent
ApplicationPreparedEvent
ApplicationReadyEvent
ApplicationStartedEvent(Springboot2.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
ApplicationStartedEvent:spring 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獲取到SpringApplication、ConfigurableEnvironment等等資訊, 可以通過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