SpringBoot spring.factories加载时机分析-环球热门
2023-06-24 16:06:56 来源:脚本之家
目录
spring.factories作用源码解析用法spring.factories作用
这个类似于Java中的SPI功能,SpringBoot启动的时候会读取所有jar包下面的META-INF/spring.factories
文件;
并且将文件中的 接口/抽象类 对应的实现类都对应起来,并在需要的时候可以实例化对应的实现类
(相关资料图)
下面我们来分析一下源码看看spring.factories
的使用场景
源码解析
启动SpringApplication,看看构造方法
public SpringApplication(ResourceLoader resourceLoader, Class>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); this.webApplicationType = WebApplicationType.deduceFromClasspath(); setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); this.mainApplicationClass = deduceMainApplicationClass(); }
其中方法getSpringFactoriesInstances( ApplicationContextInitializer.class)
是用于获取Spring中指定类实例用的;并且获取的时候是根据读取整个项目中文件路径为META-INF/spring.factories
中的内容实例化对应的实例类的;
例如这里的ApplicationContextInitializer
是一个接口,那么应该实例化哪些他的实现类呢?那就找META-INF/spring.factories
文件 ; 那么我们在spring-boot:2.1.0
jar包中找到了这个文件
读取到需要实例化的实现类为
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\ org.springframework.boot.context.ContextIdApplicationContextInitializer,\ org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\ org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
并且还在spring-boot-autoconfigure-2.1.0.RELEASE.jar
中找到了这个文件
那么文件中的两个实现类也会被实例化;加上上面4个总共有6个
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
可以看到不仅仅只是把org.springframework.context.ApplicationContextInitializer
的实例类解析了出来;而是所有的都解析了出来并且保存下来了.下次其他的类需要被实例化的时候就可以直接从内存里面拿了;
上面过程拿到了实例类之后,接下来就是实例化的过程了
privateCollection getSpringFactoriesInstances(Class type, Class>[] parameterTypes, Object... args) { ClassLoader classLoader = getClassLoader(); // Use names and ensure unique to protect against duplicates Set names = new LinkedHashSet<>( SpringFactoriesLoader.loadFactoryNames(type, classLoader)); List instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort(instances); return instances; }
方法createSpringFactoriesInstances
就是创建实例的过程;可以看到传入了对应的接口类org.springframework.context.ApplicationContextInitializer
;接下来就会实例化 上面找到了对应的实现类;
privateList createSpringFactoriesInstances(Class type, Class>[] parameterTypes, ClassLoader classLoader, Object[] args, Set names) { List instances = new ArrayList<>(names.size()); for (String name : names) { try { Class> instanceClass = ClassUtils.forName(name, classLoader); Assert.isAssignable(type, instanceClass); Constructor> constructor = instanceClass .getDeclaredConstructor(parameterTypes); T instance = (T) BeanUtils.instantiateClass(constructor, args); instances.add(instance); } catch (Throwable ex) { throw new IllegalArgumentException( "Cannot instantiate " + type + " : " + name, ex); } } return instances; }
实例化的过程如果,没有什么特别需要讲解的;
上面有个方法AnnotationAwareOrderComparator.sort(instances);
是用来排序所有实例的; 实现类需要实现 接口Ordered
; getOrder返回的值越小,优先级更高
用法
知道spring.factories
的用法之后, 那么我们就可以利用这个特性实现自己的目的;
例如我们也可以写一个接口类ApplicationContextInitializer
的实现类;
等等之类的;
以上就是SpringBoot spring.factories加载时机分析的详细内容,更多关于spring.factories加载时机的资料请关注脚本之家其它相关文章!
关键词:
[责任编辑:]
相关阅读
- (2023-06-24)SpringBoot spring.factories加载时机分析-环球热门
- (2023-06-24)机器人概念火火火!超级慢牛股被机构盯上_环球新资讯
- (2023-06-24)快讯!普京称不会让俄罗斯分裂,会保护俄罗斯人民|世界热推荐
- (2023-06-24)加快推进深远海养殖发展
- (2023-06-24)端午返程高速缓行最长未超7公里 风雨过后可能再现缓行情况 今日热文
- (2023-06-24)2022年度泰安市社会组织年报率再创新高 焦点快报
- (2023-06-24)世界最资讯丨厦门医社保要交几年,厦门医疗保险缴费年限怎么法规
- (2023-06-24)福建省2023年普通高考成绩公布通告
- (2023-06-24)「排名上升」北京哪家医院看过敏性皮肤病【排名推荐】北京过敏性皮肤病医院排行榜
- (2023-06-24)探访惠州端午节历史记忆
- (2023-06-24)风吹十里荷花香 “莲”通乡村“致富路”-每日看点
- (2023-06-24)搞懂用户分层,助力你的职场进步 世界快消息
- (2023-06-24)浓情端午粽飘香 大泉街道开展丰富多彩的端午节活动
- (2023-06-24)英特尔 4 小核处理器 N100 跑分达 i5-7400 水平,TDP 仅 6W
- (2023-06-24)聊一聊RISC-V的二三事|环球快播报
- (2023-06-24)怎样判断茶叶是不是发霉了|环球微速讯
- (2023-06-24)今日热闻!华北黄淮等地高温天气仍持续,专家解读成因
- (2023-06-24)唐军翻越5600米高山,灭了一个国家,堪称:无法复制的奇迹-环球速看料
- (2023-06-24)环球今日讯!叛军瓦格纳强硬回应普京讲话
- (2023-06-24)外资企业看好中国 持续增资扩产|当前热讯
- (2023-06-24)委托建设工程监理合同纠纷律师服务收费标准 环球观热点
- (2023-06-24)环球微头条丨医疗事故打官司的程序是什么
- (2023-06-24)浪漫实验室派对,如何选送男友最疯狂的礼物?-知乎热门推荐
- (2023-06-24)万圣节门铃和礼物创意,男生浪漫到底可行吗?如何为这个节日增添惊喜?知乎专家来为你解答!
- (2023-06-24)夏季达沃斯论坛 首次实现100%绿电供应_世界新消息
- (2023-06-24)民宿管家、外卖运营师……这些新职业扩宽就业空间
- (2023-06-24)甘肃省组织参加2023中国国际电子商务博览会
- (2023-06-24)新华时评|生命重于泰山,筑牢安全防线
- (2023-06-24)天天最资讯丨中央气象台6月24日06时继续发布暴雨黄色预警
- (2023-06-24)国际范儿,龙舟“划”向世界!端午节已成全人类共同文化遗产