SpringBoot上下文初始器載入過程詳解
阿新 • • 發佈:2020-06-08
利用 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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。