美文网首页
SpringBoot 配置化详解

SpringBoot 配置化详解

作者: coding400 | 来源:发表于2019-12-07 03:31 被阅读0次

    SpringApplicationRunnerListener

    在 SpringBoot 初始化化的过程中,通过回调 SpringApplicationRunnerListener 接口中的方法,来支持自定义化,它拥有如下几个回调方法:

        /**
         * 在容器启动正准备启动时回调,此时还为初始化 Enviroment 、以及 ApplicationContext
         */
        void starting();
    
        /**
         * 在 ConfigurableEnvironment 刚创建,而 ApplicationContext 未创建时回调
         */
        void environmentPrepared(ConfigurableEnvironment environment);
    
        /**
            * 当还未加载 SpringApplication 的时候回调
         */
        void contextPrepared(ConfigurableApplicationContext context);
    
        /**
         * .加载了 SpringApplication 未 调用refresh() 方法时回调
         */
        void contextLoaded(ConfigurableApplicationContext context);
    
        /**
              * SpringApplication 加载马上结束时回调
         */
        void finished(ConfigurableApplicationContext context, Throwable exception);
    

    使用方式:

    1. 新建类 EventPublishingRunListenerXxx 继承 SpringApplicationRunListener接口
    2. 在类路径下 META-INF/spring.factories 文件中配置:
    org.springframework.boot.SpringApplicationRunListener=\
    org.springframework.boot.context.event.EventPublishingRunListenerXxx
    

    ApplicationContextInitializer

    在 ConfigurableApplicationContext 的 refresh() 方法之前进行回调(源码:SpringApplication 348行)。 applyInitializers 方法将会调用 ApplicationContext 中所有持有的 ApplicationContextInitializer 实现类的 initialize 方法

        private void prepareContext(ConfigurableApplicationContext context,
                ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
                ApplicationArguments applicationArguments, Banner printedBanner) {
            context.setEnvironment(environment);
            postProcessApplicationContext(context);
            applyInitializers(context);
    

    使用方式:

    1. 新建类 Xxxxx并且 继承 ApplicationContextInitializer
    2. 在类路径下 META-INF/spring.factories 文件中配置:
    org.springframework.context.ApplicationContextInitializer=\
      com.mic.config.common.config.RegisterPropertyConfiguration
    
    1. 或者在启动 SpringBoot 的 main 方法中,通过 SpringApplication 对象进行添加
            SpringApplication boot = new SpringApplication(Xxx.class);
            boot.run(args);
            boot.getInitializers().add(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
                @Override
                public void initialize(ConfigurableApplicationContext applicationContext) {
    
                }
            });
    
    

    ApplicationListener

    Spring 通过观察者设计模式来对事件进行处理。在容器初始化的时候,将所有 Listener 统一交给 ApplicationContext 进行管理,根据内置的事件机制(如:ContextRefreshEvent、ContextStartedEvent等)在容器处于不同的阶段时,通过
    ApplicationContext 管理的 ApplicationListener 进行通知

    使用方式

    1. 在类路径下 META-INF/spring.factories 文件中配置继承了 ApplicationListener 接口的类 Xxx:
    # Application Listeners
    org.springframework.context.ApplicationListener=Xxx
    
    1. 通过ApplicationContext#addApplicationListener 方法添加
    ApplicationContext.addApplicationListener(new StatRefreshListener(this));
    
    1. 通过将 实现了 ApplicationListener 的类注册到 Spring IOC 容器中

    ApplicationRunner|CommandLineRunner

    在容器初始化完成之后,将被回调

    SpringApplication#callRunners

        private void callRunners(ApplicationContext context, ApplicationArguments args) {
            List<Object> runners = new ArrayList<Object>();
            runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
            runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
            AnnotationAwareOrderComparator.sort(runners);
            for (Object runner : new LinkedHashSet<Object>(runners)) {
                if (runner instanceof ApplicationRunner) {
                    callRunner((ApplicationRunner) runner, args);
                }
                if (runner instanceof CommandLineRunner) {
                    callRunner((CommandLineRunner) runner, args);
                }
            }
        }
    

    使用方式:

    通过实现 ApplicationRunner 或 CommandLineRunner 并将其注册到容器中即可,可通过 @Order 注解来调整多个 Runner 同时执行的顺序

    @Component
    @Order(value = Ordered.HIGHEST_PRECEDENCE)
    public class TestApplicationRunner implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) throws Exception {
    
        }
    }
    

    //未完待续

    相关文章

      网友评论

          本文标题:SpringBoot 配置化详解

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