zoukankan      html  css  js  c++  java
  • 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.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@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-----java.lang.Object@1ca2dfa-----class org.springframework.core.env.PropertySource$StubPropertySource-----
    servletContextInitParams-----java.lang.Object@153f538-----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)


  • 相关阅读:
    升级ios 不能连原本的xcode /xcode不能抓帧/换xcode版本 build fail
    BlackBerry Key2 键盘扩展
    再议C风格变量声明
    怎样去除SVN中的某个版本之前的所有版本
    mysql 常用基础语句
    乱码问题
    sql server
    MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
    java 时间转换
    sql server 日期
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8496099.html
Copyright © 2011-2022 走看看