SpringBoot加载应用上下文初始器
利用 Spring 工厂加载机制,实例化 ApplicationContextInitializer 实现类,并排序对象集合。
关键方法
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
Class<?>[] parameterTypes, Object... args) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// Use names and ensure unique to protect against duplicates
Set<String> names = new LinkedHashSet<>(
SpringFactoriesLoader.loadFactoryNames(type, classLoader));
List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
classLoader, args, names);
AnnotationAwareOrderComparator.sort(instances);
return instances;
}
技术实现步骤
- 实现类: org.springframework.core.io.support.SpringFactoriesLoader
- 配置资源: META-INF/spring.factories
- 排序: AnnotationAwareOrderComparator#sort
自定义初始化器
- 编写类实现ApplicationContextInitializer接口
- 有两种指定顺序的方法,第一种:类上加注解
@Order(Ordered.HIGHEST_PRECEDENCE)
,第二种则是实现Ordered接口
- 有两种指定顺序的方法,第一种:类上加注解
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HelloWorldApplicationContextInitializer<C extends ConfigurableApplicationContext>
implements ApplicationContextInitializer<C> {
@Override
public void initialize(C applicationContext) {
System.out.println("ConfigurableApplicationContext.id = "+ applicationContext.getId());
}
}
public class AfterHelloWorldApplicationContextInitializer implements ApplicationContextInitializer, Ordered {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("After application.id = " + applicationContext.getId());
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
- 在spring.properties中配置
# ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=
com.imooc.diveinspringboot.context.AfterHelloWorldApplicationContextInitializer,
com.imooc.diveinspringboot.context.HelloWorldApplicationContextInitializer