SpringBoot上下文 SpringBoot上下文初始器加载过程详解
樊梨花大大王 人气:0利用 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
加载全部内容