Spring中的事件機(jī)制
Spring中的事件機(jī)制是一個觀察者模式的實現(xiàn).觀察者模式就是一個目標(biāo)對象管理所有相依于它的觀察者對象,并且在它本身的狀態(tài)改變時主動發(fā)出通知.Spring的事件由ApplicationContext發(fā)布
ApplicationEvent
ApplicationEvent充當(dāng)事件的角色,這是一個Abstract實現(xiàn),所有的事件必須繼承自該類,約束子類實現(xiàn)的體現(xiàn),我們可以實現(xiàn)這個類定義自己的事件

Spring中默認(rèn)存在的事件有
- ContextStartedEvent:ApplicationContext啟動后觸發(fā)的事件
- ContextStoppedEvent:ApplicationContext停止后觸發(fā)的事件
- ContextRefreshedEvent:ApplicationContext初始化或刷新完成后觸發(fā)的事件
- ContextClosedEvent:ApplicationContext關(guān)閉后觸發(fā)的事件
- [x] WEB項目里會存在兩個容器,一個是rootApplicationContext ,另一個就是projectName-servlet context,這個時候會觸發(fā)兩次ContextRefreshedEvent,注意rootApplicationContext沒有parent,可以以此來區(qū)分
ApplicationListener
ApplicationListener充當(dāng)監(jiān)聽器的角色

想要監(jiān)聽相關(guān)事件只要實現(xiàn)ApplicationListener接口,并將該類注冊到Spring中托管就可以,接口中的事件可以是Spring中的事件也可以是自定義實現(xiàn)的ApplicationEvent的子類

ApplicationEventMulticaster
ApplicationEventMulticaster充當(dāng)事件發(fā)布的角色,ApplicationContext通過帶調(diào)用
初始化

添加監(jiān)聽器,這里所有被spring托管的Bean中的ApplicationListener實現(xiàn)都會被注冊
對于我們自定義的事件需要我們在條件滿足的情況下手動觸發(fā)
@Resource
private ApplicationContext applicationContext;
public void process() {
applicationContext.publishEvent(new DemoEvent(applicationContext));
}
提交事件后,ApplicationEventMulticaster會觸發(fā)相關(guān)的ApplicationListener進(jìn)行響應(yīng)
異步
關(guān)于異步,給一個線程池就可以,可以配置全局的線程池,這個全局會影響所有的事件,不推薦.推薦在監(jiān)聽器內(nèi)部添加線程池,多線程響應(yīng)事件.
監(jiān)聽器
private static ExecutorService executor = Executors.newSingleThreadExecutor();
@Override
public void onApplicationEvent(DemoEvent event) {
executor.execute( do something);
}