1. 程式人生 > 程式設計 >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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。