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 duplicatesSet<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中配置
# ApplicationContextInitializerorg.springframework.context.ApplicationContextInitializer=com.imooc.diveinspringboot.context.AfterHelloWorldApplicationContextInitializer,com.imooc.diveinspringboot.context.HelloWorldApplicationContextInitializer
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章:
1. CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chrome、Opera2. 在 XSL/XSLT 中实现随机排序3. asp(vbs)Rs.Open和Conn.Execute的详解和区别及&H0001的说明4. XML在语音合成中的应用5. Vue Element UI 表单自定义校验规则及使用6. JavaScript避免嵌套代码浅析7. 用css截取字符的几种方法详解(css排版隐藏溢出文本)8. chatGPT教我写compose函数的详细过程9. 《CSS3实战》笔记--渐变设计(一)10. CSS3实例分享之多重背景的实现(Multiple backgrounds)
