Spring擴(kuò)展功能之ApplicationListener

本節(jié)我們來學(xué)習(xí)Spring的 最后一個(gè)拓展功能,也是Spring中很重要的組成部分,ApplicationListener其主要負(fù)責(zé)監(jiān)聽容器中發(fā)布的事件【事件驅(qū)動(dòng)模型】,其事件為ApplicationEvent以及其子事件等,接下來我們首先來編寫自己的【事件監(jiān)聽】

步驟
  • 編寫一個(gè)監(jiān)聽器(ApplicationListener的實(shí)現(xiàn)類)來監(jiān)聽某個(gè)事件(ApplicationEvent及其子類)
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
    System.out.println("收到容器中的事件:"+applicationEvent);
}

上述只是其中的一種實(shí)現(xiàn)方式,我們還可以通過注解的方式來實(shí)現(xiàn)

@Service
public class UserService {

//通過注解來實(shí)現(xiàn)普桶的業(yè)務(wù)方法實(shí)現(xiàn)監(jiān)聽ApplicationEvent類型的事件
@EventListener(classes = {ApplicationEvent.class})
public void listen(ApplicationEvent event){
    System.out.println("UserService ...監(jiān)聽到的事件:"+event);
}

當(dāng)然注解@EventListener是核心,其中還是監(jiān)聽的ApplicationEvent類型的事件

  • 配置類(其主要的作用:將我們的這些組件加入到容器中)
@Configuration
@ComponentScan(value = "com.cacmp.bean.expand")
public class ExpandConfig {
}
  • 測(cè)試類
 @Test
public void testExpand(){
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExpandConfig.class);
    applicationContext.close();
}

我們來測(cè)試下看具體都收到了哪些事件,結(jié)果如下圖所示:

image.png

從測(cè)試圖中看到的是監(jiān)聽待的事件為容器刷新和容器關(guān)閉事件

  • 同樣我們也可以發(fā)布自己的事件,代碼如下:
  //Spring拓展BeanFactoryPostProcessor的測(cè)試
@Test
public void testExpand(){
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExpandConfig.class);
    
   //發(fā)布一個(gè)事件
    String event = "我自己的事件";
    ApplicationEvent applicationEvent = new ApplicationEvent(event){

    };
    applicationContext.publishEvent(applicationEvent);
    applicationContext.close();
}

這里通過AnnotationConfigApplicationContext#publishEvent()進(jìn)行我們自己事件的發(fā)布,可以測(cè)試下,看會(huì)不會(huì)監(jiān)聽到我們自己發(fā)布的事件

image.png

到這里我們事件的監(jiān)聽和發(fā)布簡(jiǎn)單的使用已完結(jié),后續(xù)我們通過源碼的方式深入的學(xué)習(xí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容