本節(jié)我們來(lái)學(xué)習(xí)Spring的 最后一個(gè)拓展功能,也是Spring中很重要的組成部分铃辖,ApplicationListener其主要負(fù)責(zé)監(jiān)聽(tīng)容器中發(fā)布的事件【事件驅(qū)動(dòng)模型】,其事件為ApplicationEvent以及其子事件等,接下來(lái)我們首先來(lái)編寫(xiě)自己的【事件監(jiān)聽(tīng)】
步驟
- 編寫(xiě)一個(gè)監(jiān)聽(tīng)器(ApplicationListener的實(shí)現(xiàn)類)來(lái)監(jiān)聽(tīng)某個(gè)事件(ApplicationEvent及其子類)
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
System.out.println("收到容器中的事件:"+applicationEvent);
}
上述只是其中的一種實(shí)現(xiàn)方式,我們還可以通過(guò)注解的方式來(lái)實(shí)現(xiàn)
@Service
public class UserService {
//通過(guò)注解來(lái)實(shí)現(xiàn)普桶的業(yè)務(wù)方法實(shí)現(xiàn)監(jiān)聽(tīng)ApplicationEvent類型的事件
@EventListener(classes = {ApplicationEvent.class})
public void listen(ApplicationEvent event){
System.out.println("UserService ...監(jiān)聽(tīng)到的事件:"+event);
}
當(dāng)然注解@EventListener是核心蚣录,其中還是監(jiān)聽(tīng)的ApplicationEvent類型的事件
- 配置類(其主要的作用:將我們的這些組件加入到容器中)
@Configuration
@ComponentScan(value = "com.cacmp.bean.expand")
public class ExpandConfig {
}
- 測(cè)試類
@Test
public void testExpand(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExpandConfig.class);
applicationContext.close();
}
我們來(lái)測(cè)試下看具體都收到了哪些事件,結(jié)果如下圖所示:
image.png
從測(cè)試圖中看到的是監(jiān)聽(tīng)待的事件為容器刷新和容器關(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();
}
這里通過(guò)AnnotationConfigApplicationContext#publishEvent()進(jìn)行我們自己事件的發(fā)布包归,可以測(cè)試下锨推,看會(huì)不會(huì)監(jiān)聽(tīng)到我們自己發(fā)布的事件
image.png
到這里我們事件的監(jiān)聽(tīng)和發(fā)布簡(jiǎn)單的使用已完結(jié)铅歼,后續(xù)我們通過(guò)源碼的方式深入的學(xué)習(xí)