1

本文咱们详细讲解一下spring boot中的监听器。

spring boot中支持的事件类型定在org.springframework.boot.context.event包中,目前支持的事件类型有如下6种:

  1. ApplicationFailedEvent
  2. ApplicationPreparedEvent
  3. ApplicationReadyEvent
  4. ApplicationStartedEvent
  5. SpringApplicationEvent
  6. ApplicationEnvironmentPreparedEvent

监听器的使用

第一:首先定义一个自己使用的监听器类并实现ApplicationListener接口。

第二:通过SpringApplication类中的addListeners方法将自定义的监听器注册进去。

ApplicationFailedEvent

ApplicationFailedEvent:该事件为spring boot启动失败时的操作

/**
* spring boot 启动的时候出现异常事件
* @author www.shareniu.com
*
*/
public class ShareniuApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {
    @Override
    public void onApplicationEvent(ApplicationFailedEvent event) {
         System.out.println("--------------:ShareniuApplicationFailedEventListener");
         Throwable exception = event.getException();
         System.out.println(exception);
        }
 }

可以通过ApplicationFailedEvent 获取Throwable实例对象获取异常信息并处理。

ApplicationPreparedEvent

ApplicationPreparedEvent:上下文准备事件。

上下文context已经准备完毕 ,可以通过ApplicationPreparedEvent获取到ConfigurableApplicationContext实例对象。ConfigurableApplicationContext类继承ApplicationContext类,但需要注意这个时候spring容器中的bean还没有被完全的加载,因此如果通过ConfigurableApplicationContext获取bean会报错的。比如报错:

Exception in thread "main" java.lang.IllegalStateException: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@69b0fd6f has not been refreshed yet

获取到上下文之后,可以将其注入到其他类中,毕竟ConfigurableApplicationContext为引用类型

public class ShareniuApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationPreparedEvent event) {
        System.out.println("###############"+"ShareniuApplicationPreparedEventListener");
        ConfigurableApplicationContext applicationContext = event.getApplicationContext();
        //如果执行下面代码则报错
        //ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);
        //System.out.println(shareniuDemo);
    }
}

ApplicationReadyEvent

ApplicationReadyEvent:上下文已经准备ok。

这个时候就可以通过ApplicationReadyEvent获取ConfigurableApplicationContext,然后通过ConfigurableApplicationContext 获取bean的信息。

public class ShareniuApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("--------------------:ShareniuApplicationReadyEventListener");
        ConfigurableApplicationContext applicationContext = event.getApplicationContext();
        //ShareniuDemo可以根基自身情况进行测试
        ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);
    }
}

ApplicationStartedEvent

ApplicationStartedEvent:spring boot 启动监听类。

可以在SpringApplication启动之前做一些手脚,比如修改SpringApplication实例对象中的属性值

public class ShareniuApplicationStartedEventListener  implements ApplicationListener<ApplicationStartedEvent>{
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        SpringApplication springApplication = event.getSpringApplication();
        springApplication.setShowBanner(false);
        System.out.println("##############################ShareniuApplicationStartedEventListener");
    }
}

SpringApplicationEvent

SpringApplicationEvent:获取SpringApplication

public class ShareniuSpringApplicationEventListener implements ApplicationListener<SpringApplicationEvent> {
    @Override
    public void onApplicationEvent(SpringApplicationEvent event) {
    System.out.println("-----------------------:ShareniuSpringApplicationEventListener");
    SpringApplication springApplication = event.getSpringApplication();
    System.out.println("###############"+springApplication);
    }
}

ApplicationEnvironmentPreparedEvent

ApplicationEnvironmentPreparedEvent:环境事先准备,spring boot中的环境已经准备ok

可以通过ApplicationEnvironmentPreparedEvent获取到SpringApplication、ConfigurableEnvironment等等信息, 可以通过ConfigurableEnvironment实例对象来修改以及获取默认的环境信息。

public class ShasreniuApplicationEnvironmentPreparedEventListener  implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        System.out.println("###############"+"ShasreniuApplicationEnvironmentPreparedEventListener");
        SpringApplication springApplication = event.getSpringApplication();
        ConfigurableEnvironment environment = event.getEnvironment();
        long timestamp = event.getTimestamp();
        Object source = event.getSource();
        System.out.println("########################"+springApplication);
        System.out.println("########################"+environment);
        System.out.println("########################"+timestamp);
        System.out.println("########################"+source);

        MutablePropertySources propertySources = environment.getPropertySources();
        if (propertySources!=null) {
        Iterator<PropertySource<?>> iterator = propertySources.iterator();
        while (iterator.hasNext()) {
        PropertySource<?> propertySource = (PropertySource<?>) iterator.next();

        System.out.println("##############:propertySource"+propertySource);
    }
    }
    }
}

监听器注册

@RestController
@SpringBootApplication()
public class Application {
    @RequestMapping("/")
    String index() {
        return "xxxxxxxxxxxxx";
    }
    public static void main(String\[\] args) {
        SpringApplication springApplication = new SpringApplication(Application.class);
        springApplication.addListeners(new ShareniuApplicationStartedEventListener());
        springApplication.addListeners(new ShasreniuApplicationEnvironmentPreparedEventListener());
        springApplication.addListeners(new ShareniuApplicationPreparedEventListener());
        springApplication.addListeners(new ShareniuApplicationFailedEventListener());
        springApplication.addListeners(new ShareniuApplicationReadyEventListener());
        springApplication.addListeners(new ShareniuSpringApplicationEventListener());
        springApplication.run(args);
    }
}

监听器注册(项目启动的加载监听)

/META-INF/spring.factories -配置参数

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yunli.core.db.config.datasource.DataSourceAutoConfig
 #Application Listeners
org.springframework.context.ApplicationListener=\
com.yunli.core.db.config.handler.ApplicationEventHandler

逐梦小生
222 声望249 粉丝