美文网首页Spring
ApplicationContextInitializer

ApplicationContextInitializer

作者: 王勇1024 | 来源:发表于2019-02-24 18:46 被阅读1次

    ApplicationContextInitializer是一个回调接口,它会在ConfigurableApplicationContext的refresh()方法调用之前被调用,做一些容器的初始化工作。
    主要是在ApplicationContextInitializer中initialize方法中拉起了ConfigurationClassPostProcessor这个类,通过这个processor实现了beandefinition。

    package org.springframework.context;
    
    public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
        // 初始化给定的applicationContext
        void initialize(C applicationContext);
    }
    

    自定义ApplicationContextInitializer

    有时候我们需要实现自定义的ApplicationContextInitializer,需要实现ApplicationContextInitializer接口,并重写initialize方法。

    package com.yidian.data.initializer;
    
    @Order(2)
    public class HelloApplicationContextInitializer implements ApplicationContextInitializer {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            System.out.println("HelloApplicationContextInitializer initialize");
        }
    }
    

    可以通过@Order注解来指定其注册的顺序,所有的ApplicationContextInitializer均可以实现order接口进行优先级的设置:

    1. 基于Order值升序排序,反应的就是优先级的从高到底
    2. 对于拥有相同Order值的对象,任意顺序
    3. 对于不能排序的对象(没有实现Ordered接口,没有@Order注解或者@Priority注解),会排在最后,因为这类对象的优先级是最低的

    三种注册方式

    1. 在spring.factories中注册
    org.springframework.context.ApplicationContextInitializer=\
      com.yidian.data.initializer.HelloApplicationContextInitializer
    
    1. 在main方法中注册
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(HelloApplication.class);
        springApplication.addInitializers(new HelloApplicationContextInitializer());
        springApplication.run(args);
    }
    
    1. 在application.properties中配置
    context.initializer.classes=com.yidian.data.initializer.HelloApplicationContextInitializer
    

    以上3中方法都可以实现自定义的Initializer,只不过执行的顺序有差异。

    系统内置的ApplicationContextInitializer

    SpringBoot默认情况下提供了6个initializer,分别由2个jar提供:

    • spring-boot-1.5.2.RELEASE.jar
    org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer
    org.springframework.boot.context.ContextIdApplicationContextInitializer
    org.springframework.boot.context.config.DelegatingApplicationContextInitializer
    org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
    
    • spring-boot-autoconfigure-1.5.2.RELEASE.jar
    org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer
    org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
    

    下面我就简单介绍一个这几个Initializer的作用:

    1. DelegatingApplicationContextInitializer
      读取spring.properties文件context.initializer.classes属性配置的Initializer类,并对其进行实例化,然后调用其initialize()方法
    2. ServerPortInfoApplicationContextInitializer
      将自己注册到ApplicationContext的listener列表中,并监听WebServerInitializedEvent事件,事件被触发时,设置local.{serverNamespace}.port属性为应用的服务端口。
    3. ConfigurationWarningsApplicationContextInitializer
      实例化一个ConfigurationWarningsPostProcessor实例,并将其添加到ApplicationContext的beanFactoryPostProcessors中。
    4. ContextIdApplicationContextInitializer
      为当前的ApplicationContext设置一个唯一标识:
    String name = environment.getProperty("spring.application.name");
    return StringUtils.hasText(name) ? name : "application";
    
    1. SharedMetadataReaderFactoryContextInitializer
      实例化一个CachingMetadataReaderFactoryPostProcessor实例,并将其添加到ApplicationContext的beanFactoryPostProcessors中。
    2. AutoConfigurationReportLoggingInitializer

    相关文章

      网友评论

        本文标题:ApplicationContextInitializer

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