示例
通过DelegatingApplicationContextInitializer类,来自定义实现初始化器.
创建一个TestInitializer 实现ApplicationContextInitializer,Ordered 接口
一个是初始化器接口, 一个是排序.
/**
* @Author: xc
* @Date: 2020/6/14
*/
public class TestInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {
//执行初始化器方法
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("=====通过DelegatingApplicationContextInitializer, 设置context.initializer.classes来实现自定义初始化器");
}
//排序 数值小的先执行
@Override
public int getOrder() {
return 0;
}
}
然后配上类的限定名(可以设置多个用, 隔开)
context.initializer.classes=com.zxc.demo.TestInitializer
效果
原理
在run方法流程中的 准备上下文: prepareContext方法
springboot的初始化器之一的DelegatingApplicationContextInitializer
private static final String PROPERTY_NAME = "context.initializer.classes";
//DelegatingApplicationContextInitializer的初始化方法
@Override
public void initialize(ConfigurableApplicationContext context) {
ConfigurableEnvironment environment = context.getEnvironment();
List<Class<?>> initializerClasses = getInitializerClasses(environment);
if (!initializerClasses.isEmpty()) {
applyInitializerClasses(context, initializerClasses);
}
}
//------
//1.获取context.initializer.classes设置的初始化器
private List<Class<?>> getInitializerClasses(ConfigurableEnvironment env) {
//从配置环境中读取context.initializer.classes 多个类 , 隔开
String classNames = env.getProperty(PROPERTY_NAME);
List<Class<?>> classes = new ArrayList<>();
if (StringUtils.hasLength(classNames)) {
// 逗号做分隔
for (String className : StringUtils.tokenizeToStringArray(classNames, ",")) {
classes.add(getInitializerClass(className));
}
}
return classes;
}
//------
//2.校验,执行
private void applyInitializerClasses(ConfigurableApplicationContext context, List<Class<?>> initializerClasses) {
Class<?> contextClass = context.getClass();
List<ApplicationContextInitializer<?>> initializers = new ArrayList<>();
for (Class<?> initializerClass : initializerClasses) {
//instantiateInitializer 断言,校验是否为ApplicationContextInitializer子类 + 实例化
initializers.add(instantiateInitializer(contextClass, initializerClass));
}
applyInitializers(context, initializers);
}
//排序然后执行
private void applyInitializers(ConfigurableApplicationContext context,
List<ApplicationContextInitializer<?>> initializers) {
initializers.sort(new AnnotationAwareOrderComparator());
for (ApplicationContextInitializer initializer : initializers) {
//执行initialize方法
initializer.initialize(context);
}
}