SpringBoot入门之事件监听

Posted 木易森林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot入门之事件监听相关的知识,希望对你有一定的参考价值。

  spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利,sptingboot支持的事件类型有以下五种:

  • ApplicationStartingEvent
  • ApplicationFailedEvent
  • ApplicationPreparedEvent
  • ApplicationReadyEvent
  • ApplicationEnvironmentPreparedEvent

实现监听步骤

  1.监听类实现ApplicationListener接口

  2.将监听类添加到SpringApplication实例中

ApplicationStartingEvent

  ApplicationStartingEvent:springboot启动开始的时候执行的事件,在该事件中可以获取到SpringApplication对象,可做一些执行前的设置。

package com.ysl.listener;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

/**
 * springboot启动监听类
 */
public class MyApplicationStartingEventListener implements ApplicationListener<ApplicationStartingEvent>{

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        SpringApplication application = applicationStartingEvent.getSpringApplication();
        application.setBannerMode(Banner.Mode.OFF);
        System.out.println("--------- execute MyApplicationStartingEventListener----------");
    }

}
package com.ysl;

import com.ysl.listener.MyApplicationStartingEventListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args){
        SpringApplication app =new SpringApplication(Application.class);
        app.addListeners(new MyApplicationStartingEventListener());
        app.run(args);
    }
}

执行结果如下:

--------- execute MyApplicationStartingEventListener----------
2018-03-03 11:00:58.027  INFO 7644 --- [           main] com.ysl.Application                      : Starting Application on master with PID 7644 (/home/workspace/springboottest/target/classes started by ysl in /home/workspace/springboottest)
2018-03-03 11:00:58.032  INFO 7644 --- [           main] com.ysl.Application                      : No active profile set, falling back to default profiles: default
2018-03-03 11:00:58.182  INFO 7644 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]1f32bf7: startup date [Sat Mar 03 11:00:58 CST 2018]; root of context hierarchy

ApplicationEnvironmentPreparedEvent

  ApplicationEnvironmentPreparedEvent:spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作,例如:修改默认的配置信息,增加额外的配置信息等等。

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;

import java.util.Iterator;

/**
 * spring boot 配置环境事件监听
 */
public class MyApplicationEnvironmentPreparedEventListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{

    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment environment = event.getEnvironment();
        MutablePropertySources maps = environment.getPropertySources();
        if(maps != null){
            Iterator<PropertySource<?>> its = maps.iterator();
            while(its.hasNext()){
                PropertySource<?> ps =its.next();
                System.out.print(ps.getName() + "-----");
                System.out.print(ps.getSource() + "-----");
                System.out.println(ps.getClass() + "-----");
            }
        }
    }

}

 

运行结果

--------- execute MyApplicationStartingEventListener----------
servletConfigInitParams[email protected]class org.springframework.core.env.PropertySource$StubPropertySource-----
servletContextInitParams[email protected]class org.springframework.core.env.PropertySource$StubPropertySource-----

 

ApplicationPreparedEvent

  ApplicationPreparedEvent:spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。值得注意的是:在该监听器中是无法获取自定义bean并进行操作的。

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;

public class MyApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent>{

    @Override
    public void onApplicationEvent(ApplicationPreparedEvent event) {
        ConfigurableApplicationContext context = event.getApplicationContext();
        passContextInfo(context);
    }

    /**
     * 传递上下文
     * @param cac
     */
    private void passContextInfo(ApplicationContext cac) {
        //dosomething()
    }
}

ApplicationFailedEvent

  ApplicationFailedEvent:spring boot启动异常时执行事件,在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;

public class MyApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {

    @Override
    public void onApplicationEvent(ApplicationFailedEvent applicationFailedEvent) {
        Throwable t = applicationFailedEvent.getException();
        //do something
    }

}

ApplicationReadyEvent

  ApplicationReadyEvent:springboot 加载完成时候执行的事件

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;

public class MyApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent>{
    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        applicationReadyEvent.getApplicationContext();
        System.out.println("start ready");
    }
}

运行结果  

2018-03-03 11:19:54.453  INFO 8478 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-03-03 11:19:54.513  INFO 8478 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
start ready
2018-03-03 11:19:54.517  INFO 8478 --- [           main] com.ysl.Application                      : Started Application in 4.718 seconds (JVM running for 5.264)

 

 

 

 





以上是关于SpringBoot入门之事件监听的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 源码赏析之事件监听

重学SpringBoot系列之生命周期内的拦截过滤与监听

SpringBoot 之事件发布系统

Springboot系列解析Springboot事件机制,从入门到大师

LayaAir入门之EventDispatcher类

SpringBoot基于注解切面监听事件