本節(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í)