SpringBoot上下文初始器加载过程详解
利用Spring工厂加载机制,实例化ApplicationContextInitializer实现类,并排序对象集合。
关键方法
privateCollection getSpringFactoriesInstances(Class type, Class>[]parameterTypes,Object...args){ ClassLoaderclassLoader=Thread.currentThread().getContextClassLoader(); //Usenamesandensureuniquetoprotectagainstduplicates Set names=newLinkedHashSet<>( SpringFactoriesLoader.loadFactoryNames(type,classLoader)); List instances=createSpringFactoriesInstances(type,parameterTypes, classLoader,args,names); AnnotationAwareOrderComparator.sort(instances); returninstances; }
技术实现步骤
- 实现类:org.springframework.core.io.support.SpringFactoriesLoader
- 配置资源:META-INF/spring.factories
- 排序:AnnotationAwareOrderComparator#sort
自定义初始化器
编写类实现ApplicationContextInitializer接口
有两种指定顺序的方法,第一种:类上加注解@Order(Ordered.HIGHEST_PRECEDENCE),第二种则是实现Ordered接口
@Order(Ordered.HIGHEST_PRECEDENCE) publicclassHelloWorldApplicationContextInitializerimplementsApplicationContextInitializer { @Override publicvoidinitialize(CapplicationContext){ System.out.println("ConfigurableApplicationContext.id="+applicationContext.getId()); } }
publicclassAfterHelloWorldApplicationContextInitializerimplementsApplicationContextInitializer,Ordered{ @Override publicvoidinitialize(ConfigurableApplicationContextapplicationContext){ System.out.println("Afterapplication.id="+applicationContext.getId()); } @Override publicintgetOrder(){ returnOrdered.LOWEST_PRECEDENCE; } }
在spring.properties中配置
#ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=\
com.imooc.diveinspringboot.context.AfterHelloWorldApplicationContextInitializer,\
com.imooc.diveinspringboot.context.HelloWorldApplicationContextInitializer
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。