SpringBoot上下文初始器加載過程詳解
利用 Spring 工廠加載機(jī)制,實(shí)例化 ApplicationContextInitializer 實(shí)現(xiàn)類,并排序?qū)ο蠹稀?/p>
關(guān)鍵方法
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;}
技術(shù)實(shí)現(xiàn)步驟
實(shí)現(xiàn)類: org.springframework.core.io.support.SpringFactoriesLoader 配置資源: META-INF/spring.factories 排序: AnnotationAwareOrderComparator#sort自定義初始化器
編寫類實(shí)現(xiàn)ApplicationContextInitializer接口
有兩種指定順序的方法,第一種:類上加注解@Order(Ordered.HIGHEST_PRECEDENCE),第二種則是實(shí)現(xiàn)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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Django上傳xlsx文件直接轉(zhuǎn)化為DataFrame或直接保存的方法2. 解決Android studio 3.6.1 出現(xiàn)Cause: unable to find valid certification path to requested target 報(bào)錯(cuò)的問題3. 關(guān)于 Android WebView 的內(nèi)存泄露問題4. SpringBoot 使用 @Value 注解讀取配置文件給靜態(tài)變量賦值5. 從零學(xué)CSS系列之文本屬性6. html5手機(jī)觸屏touch事件介紹7. 教你在 IntelliJ IDEA 中使用 VIM插件的詳細(xì)教程8. 《CSS3實(shí)戰(zhàn)》筆記--漸變?cè)O(shè)計(jì)(一)9. 深度源碼解析Java 線程池的實(shí)現(xiàn)原理10. 如何基于http代理解決Java固定ip問題
