Spring

ApplicationContextInitializer

2019-02-24  本文已影响1人  王勇1024

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提供:

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer
org.springframework.boot.context.ContextIdApplicationContextInitializer
org.springframework.boot.context.config.DelegatingApplicationContextInitializer
org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer
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
上一篇 下一篇

猜你喜欢

热点阅读