ApplicationListener

簡介

ApplicationListener:監聽容器中發布的事件。

實例

MyApplicationListener.java

@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {

    //當容器中發布此事件以后,方法觸發
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        // TODO Auto-generated method stub
        System.out.println("收到事件:"+event);
    }

}

配置類

@ComponentScan("com.atguigu.ext")
@Configuration
public class ExtConfig {
    
    @Bean
    public Blue blue(){
        return new Blue();
    }

}

測試類

    @Test
    public void test01(){
        AnnotationConfigApplicationContext applicationContext  = new AnnotationConfigApplicationContext(ExtConfig.class);
        
        
        //發布事件;
        applicationContext.publishEvent(new ApplicationEvent(new String("我發布的時間")) {
        });
        
        applicationContext.close();
    }

原理

監聽 ApplicationEvent 及其下面的子事件:
步驟:
1)、寫一個監聽器(ApplicationListener實現類)來監聽某個事件(ApplicationEvent及其子類)
@EventListener;
原理:使用EventListenerMethodProcessor處理器來解析方法上的@EventListener;
2)、把監聽器加入到容器;
3)、只要容器中有相關事件的發布,我們就能監聽到這個事件;ContextRefreshedEvent:容器刷新完成(所有bean都完全創建)會發布這個事件;ContextClosedEvent:關閉容器會發布這個事件;
4)、發布一個事件:applicationContext.publishEvent();

發布事件的原理:
ContextRefreshedEvent、IOCTest_Ext$1[source=我發布的時間]、ContextClosedEvent;
1)、ContextRefreshedEvent事件:a、容器創建對象:refresh();b、finishRefresh();容器刷新完成會發布ContextRefreshedEvent事件
2)、自己發布事件;
3)、容器關閉會發布ContextClosedEvent;

【事件發布流程】:
publishEvent(new ContextRefreshedEvent(this));
1)、獲取事件的多播器(派發器):getApplicationEventMulticaster()
2)、multicastEvent派發事件;
3)、獲取到所有的ApplicationListener;
for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
a)、如果有Executor,可以支持使用Executor進行異步派發;Executor executor = getTaskExecutor();
b)、否則,同步的方式直接執行listener方法;invokeListener(listener, event); 拿到listener回調onApplicationEvent方法;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容