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,"自定義監聽事件")); } }