SpringBoot加载应用上下文初始器

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
原文地址:https://www.cnblogs.com/fjf3997/p/13035852.html