欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring注解驅動之@EventListener注解使用方式

 更新時間:2022年09月30日 09:15:37   作者:融極  
這篇文章主要介紹了Spring注解驅動之@EventListener注解使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

概述

之前我們說過可以通過實現(xiàn)ApplicationListener接口來監(jiān)聽處理事件。

其實還有一種注解方式來監(jiān)聽處理事件。即使用@EventListener注解,通過該注解就可以在方法上監(jiān)聽事件了。

這樣普通的業(yè)務邏輯組件中就可以直接使用這個注解來監(jiān)聽事件了,無需實現(xiàn)ApplicationListener接口了,確實比較方便,但是其原理是和ApplicationListener接口一樣的,也可以自定義一個多波器實現(xiàn)異步監(jiān)聽事件,定義方法與之前一致。Spring注解驅動之ApplicationListener異步處理事件

@EventListener注解的用法

首先,編寫一個普通的業(yè)務邏輯組件,例如UserService,并在該組件上標注一個@Service注解。

我們只需要簡單的在該方法上標注一個@EventListener注解,就可以讓方法來監(jiān)聽事件了??梢酝ㄟ^注解的classes屬性來指定需要監(jiān)聽的事件。

例如,我們可以讓listen方法監(jiān)聽ApplicationEvent及其子事件。

最后我們在參數(shù)的位置上寫一個ApplicationEvent參數(shù)來接收事件,參數(shù)值是在Spring框架調用的時候自動賦值的。

package com.meimeixia.ext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class UserService {
	
	// 一些其他的方法...
	@EventListener(classes=ApplicationEvent.class)
	public void listen(ApplicationEvent event) {
		System.out.println("UserService...監(jiān)聽到的事件:" + event);
	}
}

寫個測試用例。

package com.meimeixia.test;
import org.junit.Test;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.meimeixia.ext.ExtConfig;
public class IOCTest_Ext {
	
	@Test
	public void test01() {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
		
		// 發(fā)布一個事件
		applicationContext.publishEvent(new ApplicationEvent(new String("我發(fā)布的事件")) {
		});
		
		// 關閉容器
		applicationContext.close();
	}
}

你會發(fā)現(xiàn)Eclipse控制臺打印出了如下內容,可以清晰地看到,不僅我們之前編寫的監(jiān)聽器(例如MyApplicationListener)收到了事件,而且UserService組件也收到了事件。

也就是說,每一個都能正確地收到事件。

@EventListener注解的原理

我們可以點進去@EventListener這個注解里面去看一看,如下圖所示,可以看到這個注解上面有一大堆的描述,從描述中我們可以猜到這個注解的內部工作原理。

描述中有一個醒目的字眼,即參考EventListenerMethodProcessor。意思可能是說,如果你想搞清楚@EventListener注解的內部工作原理,那么可以參考EventListenerMethodProcessor這個類。

EventListenerMethodProcessor是一個處理器,其作用是來解析方法上的@EventListener注解的。

這也就是說,Spring會使用EventListenerMethodProcessor來解析方法上的@EventListener注解。

因此,搞清楚這個處理器是怎樣工作的,就搞清楚了@EventListener注解的內部工作原理。

仔細看一下SmartInitializingSingleton接口中afterSingletonsInstantiated方法上面的描述信息,不難看出該方法是在所有的單實例bean已經(jīng)全部被創(chuàng)建完了以后才會被執(zhí)行。

在介紹SmartInitializingSingleton接口的時候,我們也能從描述信息中知道,在所有的單實例bean已經(jīng)全部被創(chuàng)建完成以后才會觸發(fā)該接口。緊接著下面一段的描述還說了,該接口的調用時機有點類似于ContextRefreshedEvent事件,即在容器刷新完成以后,便會回調該接口。也就是說,這個時候容器已經(jīng)創(chuàng)建完了。

如果所有的單實例bean都已經(jīng)創(chuàng)建完了,也就是說下面這一步都執(zhí)行完了,那么說明IOC容器已經(jīng)創(chuàng)建完成了。

緊接著便會來調用finishRefresh方法,容器已經(jīng)創(chuàng)建完了,此時就會來發(fā)布容器已經(jīng)刷新完成的事件。

這就呼應了開頭的那句話,即SmartInitializingSingleton接口的調用時機有點類似于ContextRefreshedEvent事件,即在容器刷新完成以后,便會回調該接口。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot集成kaptcha驗證碼

    SpringBoot集成kaptcha驗證碼

    這篇文章主要為大家詳細介紹了SpringBoot集成kaptcha驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫連接池原理解析

    SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫連接池原理解析

    這篇文章主要介紹了SpringBoot2.0 中 HikariCP 數(shù)據(jù)庫連接池原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java并發(fā)之ReentrantLock類源碼解析

    Java并發(fā)之ReentrantLock類源碼解析

    這篇文章主要為大家詳細介紹了Java并發(fā)系列之ReentrantLock源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java.lang.UnsupportedOperationException分析及解決辦法

    java.lang.UnsupportedOperationException分析及解決辦法

    日常開發(fā)中我遇到java.lang.UnsupportedOperationException:異常兩次了,下面這篇文章主要給對大家介紹了關于java.lang.UnsupportedOperationException分析及解決辦法,需要的朋友可以參考下
    2024-03-03
  • Java如何發(fā)起http請求的實現(xiàn)(GET/POST)

    Java如何發(fā)起http請求的實現(xiàn)(GET/POST)

    這篇文章主要介紹了Java如何發(fā)起http請求的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 基于java枚舉類綜合應用的說明

    基于java枚舉類綜合應用的說明

    一個枚舉類,可以看成包括它的一些子類(枚舉)的一個類,而且枚舉類的構造方法只能是私有的
    2013-05-05
  • SpringBoot如何使用@Value取配置文件中的map配置

    SpringBoot如何使用@Value取配置文件中的map配置

    這篇文章主要介紹了SpringBoot如何使用@Value取配置文件中的map配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java之左旋轉字符串介紹

    java之左旋轉字符串介紹

    java之左旋轉字符串介紹,需要的朋友可以參考一下
    2013-02-02
  • Java形參和實參的實例之Integer類型與Int類型用法說明

    Java形參和實參的實例之Integer類型與Int類型用法說明

    這篇文章主要介紹了Java形參和實參的實例之Integer類型與Int類型用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 一篇文章徹底解決IDEA輸出中文亂碼問題

    一篇文章徹底解決IDEA輸出中文亂碼問題

    IDEA輸出中文是亂碼的問題,網(wǎng)上教程很多,很復雜,作者測試了很多種辦法,現(xiàn)在將總結的方法提供給大家,下面這篇文章主要給大家介紹了關于徹底解決IDEA輸出中文亂碼問題的相關資料,需要的朋友可以參考下
    2023-05-05

最新評論