Spring擴展之二:ApplicationListener
- 2020 年 11 月 21 日
- 筆記
- spring, springboot, Spring擴展
1.介紹
用於監聽應用程序事件的接口。
子接口:GenericApplicationListener,SmartApplicationListener。
通過ApplicationEvent類和ApplicationListener接口,可以實現ApplicationContext事件處理。
ApplicationContext事件機制是觀察者設計模式的實現。
@FunctionalInterface public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { /** * 處理應用程序事件 */ void onApplicationEvent(E event); }
Spring內置事件:
ContextRefreshedEvent:ApplicationContext 被初始化或刷新時,該事件被發佈。
@SuppressWarnings("serial") public class ContextRefreshedEvent extends ApplicationContextEvent { /** * 創建一個新的ContextRefreshedEvent事件。 * 此時source已初始化或刷新 */ public ContextRefreshedEvent(ApplicationContext source) { super(source); } }
ContextStartedEvent:ApplicationContext啟動時發佈的廣播事件。
ContextStoppedEvent:ApplicationContext停止時發佈的廣播事件。
ContextClosedEvent:ApplicationContext關閉時發佈的廣播事件。
SpringBoot內置事件:
ApplicationStartingEvent:系統運行開始時發佈的廣播事件,在進行任何處理之前發佈廣播。
@SuppressWarnings("serial") public class ApplicationStartingEvent extends SpringApplicationEvent { /** * 創建一個新的ApplicationStartingEvent事件 * @param application 當前應用 * @param args 當前參數 */ public ApplicationStartingEvent(SpringApplication application, String[] args) { super(application, args); } }
ApplicationEnvironmentPreparedEvent:在系統環境準備完成,創建上下文之前發佈的廣播事件。
ApplicationContextInitializedEvent:在完成所有初始化工作之後,加載任何Bean之前發佈的廣播事件。
ApplicationPreparedEvent:在加載bean definitions之後,容器刷新之前發佈的廣播事件。
ApplicationStartedEvent:在容器刷新之後,調用任何應用程序和命令程序之前發佈的廣播事件。
ApplicationReadyEvent:在調用任何應用程序和命令程序之後發佈的廣播事件。
ApplicationFailedEvent:在啟動發生異常時發佈的廣播事件。
2.使用
自定義事件
@SuppressWarnings("serial") public class CustomApplicationStartedEvent extends ApplicationContextEvent { // 自定義參數 private final String msg; public CustomApplicationStartedEvent(ApplicationContext source,String msg) { super(source); this.msg = msg; } //getter方法 public String getMsg() { return msg; } }
自定義監聽
@Component public class CustomApplicationListener implements ApplicationListener<CustomApplicationStartedEvent> { @Override public void onApplicationEvent(CustomApplicationStartedEvent event) { System.out.println(event.getMsg()); ApplicationContext applicationContext = event.getApplicationContext(); // 打印容器裏面有多少個bean System.out.println("bean count=====" + applicationContext.getBeanDefinitionCount()); // 打印所有beanName System.out.println(applicationContext.getBeanDefinitionCount() + "個Bean的名字如下:"); String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String beanName : beanDefinitionNames) { System.out.println("--------"+beanName); } } }
發佈廣播事件
@SpringBootApplication public class SsoApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(SsoApplication .class); ConfigurableApplicationContext run = application.run(args); run.publishEvent(new CustomApplicationStartedEvent(run,"自定義監聽事件")); } }