Spring擴充套件之二:ApplicationListener

柒月丶發表於2020-11-21

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

 

相關文章