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)


  • 相关阅读:
    AS将一个项目导入到另一个项目中
    Android Studio出现:Cause: unable to find valid certification path to requested target
    小米手机Toast带app名称
    PopupWindow 点击外部区域无法关闭的问题
    EditText inputType类型整理
    Fragment通过接口回调向父Activity传值
    Android selector一些坑
    Installation failed with message Failed to commit install session 634765663 with command cmd package
    旷视上海研究院机器人方向招聘
    语义SLAM的数据关联和语义定位(四)多目标测量概率模型
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8496099.html
Copyright © 2011-2022 走看看