美文网首页
springboot事件监听

springboot事件监听

作者: David_e92c | 来源:发表于2019-03-24 11:18 被阅读0次

    看那个人好像一条狗-------------------------------------By 周星星
    首先来看事件监听的定义的SpringApplicationRunListener,用户可以通过这个接口实现自己的自定义流程在SpringApplication启动过程中,现在我们来看看SpringApplicationRunListener的主要结构,这个接口主要定义了5个方法,包含了SpringApplication启动流程一系列事件

    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.core.env.ConfigurableEnvironment;
    import org.springframework.core.io.support.SpringFactoriesLoader;
    
    /**
     * Listener for the {@link SpringApplication} {@code run} method.
     * {@link SpringApplicationRunListener}s are loaded via the {@link SpringFactoriesLoader}
     * and should declare a public constructor that accepts a {@link SpringApplication}
     * instance and a {@code String[]} of arguments. A new
     * {@link SpringApplicationRunListener} instance will be created for each run.
     *
     * @author Phillip Webb
     * @author Dave Syer
     */
    public interface SpringApplicationRunListener {
    
        /**
         * Called immediately when the run method has first started. Can be used for very
         * early initialization.
         *SpringApplication运行run方法时立即调用此方法,可以用户非常早期的初始化工作
         */
    
        void starting();
    
        /**
         * Called once the environment has been prepared, but before the
         * {@link ApplicationContext} has been created.
         * @param environment the environment
         * Environment准备好后,并且ApplicationContext创建之前调用
         */
        void environmentPrepared(ConfigurableEnvironment environment);
    
        /**
         * Called once the {@link ApplicationContext} has been created and prepared, but
         * before sources have been loaded.
         * @param context the application context
         * ApplicationContext创建好后立即调用
         */
        void contextPrepared(ConfigurableApplicationContext context);
    
        /**
         * Called once the application context has been loaded but before it has been
         * refreshed.
         * @param context the application context
         * ApplicationContext加载完成,在refresh之前调用
         */
        void contextLoaded(ConfigurableApplicationContext context);
    
        /**
         * Called immediately before the run method finishes.
         * @param context the application context or null if a failure occurred before the
         * context was created
         * @param exception any run exception or null if run completed successfully.
         * 当run方法结束之前调用
         */
        void finished(ConfigurableApplicationContext context, Throwable exception);
    
    }
    
    

    SpringBoot通过读取spring.factories文件通过反射的机制获取SpringApplicationRunListener的实现类

    /**
         * Run the Spring application, creating and refreshing a new
         * {@link ApplicationContext}.
         * @param args the application arguments (usually passed from a Java main method)
         * @return a running {@link ApplicationContext}
         */
        public ConfigurableApplicationContext run(String... args) {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            ConfigurableApplicationContext context = null;
            Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
            configureHeadlessProperty();
            SpringApplicationRunListeners listeners = getRunListeners(args);
            listeners.starting();
            try {
                ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                        args);
                ConfigurableEnvironment environment = prepareEnvironment(listeners,
                        applicationArguments);
                configureIgnoreBeanInfo(environment);
                Banner printedBanner = printBanner(environment);
                context = createApplicationContext();
                exceptionReporters = getSpringFactoriesInstances(
                        SpringBootExceptionReporter.class,
                        new Class[] { ConfigurableApplicationContext.class }, context);
                prepareContext(context, environment, listeners, applicationArguments,
                        printedBanner);
                refreshContext(context);
                afterRefresh(context, applicationArguments);
                listeners.finished(context, null);
                stopWatch.stop();
                if (this.logStartupInfo) {
                    new StartupInfoLogger(this.mainApplicationClass)
                            .logStarted(getApplicationLog(), stopWatch);
                }
                callRunners(context, applicationArguments);
                return context;
            }
            catch (Throwable ex) {
                handleRunFailure(context, listeners, exceptionReporters, ex);
                throw new IllegalStateException(ex);
            }
        }
    
    
    

    其中SpringApplicationRunListeners listeners = getRunListeners(args)就是springBoot获取SpringApplicationRunListener监听器核心代码,时序图如下

    springbootlistener.png

    相关文章

      网友评论

          本文标题:springboot事件监听

          本文链接:https://www.haomeiwen.com/subject/igmyvqtx.html