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接口进行优先级的设置:
- 基于Order值升序排序,反应的就是优先级的从高到底
- 对于拥有相同Order值的对象,任意顺序
- 对于不能排序的对象(没有实现Ordered接口,没有@Order注解或者@Priority注解),会排在最后,因为这类对象的优先级是最低的
三种注册方式
- 在spring.factories中注册
org.springframework.context.ApplicationContextInitializer=\
com.yidian.data.initializer.HelloApplicationContextInitializer
- 在main方法中注册
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(HelloApplication.class);
springApplication.addInitializers(new HelloApplicationContextInitializer());
springApplication.run(args);
}
- 在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的作用:
- DelegatingApplicationContextInitializer
读取spring.properties文件context.initializer.classes属性配置的Initializer类,并对其进行实例化,然后调用其initialize()方法 - ServerPortInfoApplicationContextInitializer
将自己注册到ApplicationContext的listener列表中,并监听WebServerInitializedEvent事件,事件被触发时,设置local.{serverNamespace}.port属性为应用的服务端口。 - ConfigurationWarningsApplicationContextInitializer
实例化一个ConfigurationWarningsPostProcessor实例,并将其添加到ApplicationContext的beanFactoryPostProcessors中。 - ContextIdApplicationContextInitializer
为当前的ApplicationContext设置一个唯一标识:
String name = environment.getProperty("spring.application.name");
return StringUtils.hasText(name) ? name : "application";
- SharedMetadataReaderFactoryContextInitializer
实例化一个CachingMetadataReaderFactoryPostProcessor实例,并将其添加到ApplicationContext的beanFactoryPostProcessors中。 - AutoConfigurationReportLoggingInitializer
网友评论