SpringBoot上下文初始器加载过程详解

利用 Spring 工厂加载机制,实例化 ApplicationContextInitializer 实现类,并排序对象集合。

关键方法
1
2
3
4
5
6
7
8
9
10
11
private Collection getSpringFactoriesInstances(Class type,
            Class[] parameterTypes, Object... args) {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // Use names and ensure unique to protect against duplicates
        Set names = new LinkedHashSet<>(
                SpringFactoriesLoader.loadFactoryNames(type, classLoader));
        List 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接口
1
2
3
4
5
6
7
8
@Order(Ordered.HIGHEST_PRECEDENCE)
public class HelloWorldApplicationContextInitializer
    implements ApplicationContextInitializer {
  @Override
  public void initialize(C applicationContext) {
    System.out.println("ConfigurableApplicationContext.id = "+ applicationContext.getId());
  }
}
1
2
3
4
5
6
7
8
9
10
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

你可能感兴趣的:(SpringBoot上下文初始器加载过程详解)