@Import和spring.factories实现原理
本篇文章主要记录@Import和spring.factories实现原理,具体怎么用,可自行百度
demo地址(代码结构很简单,不做任何说明)
@Import
基本用法参考
spring.factories
基本用法参考
问题:为什么@Import和spring.factories能够实现自动配置?
下面列出关键流程代码:从run方法开始,中间代码省略
SpringApplication.run(ClientApplication.class);refresh()invokeBeanFactoryPostProcessors(beanFactory);invokeBeanFactoryPostProcessors()postProcessBeanDefinitionRegistry(registry)processConfigBeanDefinitions(registry);
processConfigBeanDefinitions(registry)关键代码
private final Map<ConfigurationClass, ConfigurationClass> configurationClasses = new LinkedHashMap<>();//code_1
do{parser.parse(candidates);//Set<BeanDefinitionHolder>
}while(!candidates.isEmpty());//code_2
this.reader.loadBeanDefinitions(configClasses);//Map:configurationClasses
code_1循环解析BeanDefinitionHolder,实际上调用processConfigurationClass()将解析的结果添加到configurationClasses(map)中,解析过程如下:
public void parse(Set<BeanDefinitionHolder> configCandidates) {//多种解析方式parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());parse(bd.getBeanClassName(), holder.getBeanName());//这是关联spring.factories的代码(后面再解释)this.deferredImportSelectorHandler.process();}
//其中parse流程
parse()processConfigurationClass()doProcessConfigurationClass()
doProcessConfigurationClass():里面处理多种配置类
// Recursively process any member (nested) classes first
// Process any @PropertySource annotations
// Process any @Import annotations
processImports(configClass, sourceClass, getImports(sourceClass), filter, true);
// Process any @ImportResource annotations
// Process individual @Bean methods
// Process default methods on interfaces
//...
看看processImports()的第三个参数getImports(sourceClass),收集@Import注解类
在processImports方法中,可以看到(ImportSelector.class,ImportBeanDefinitionRegistrar.class)就是@import三种实现方法类
关于spring.factories的实现原理,最终都会调用SpringFactoriesLoader.loadFactoryNames(),
如EnableAutoConfiguration流程:
- @SpringBootApplication注解中携带@EnableAutoConfiguration注解
- @EnableAutoConfiguration注解使用@Import(AutoConfigurationImportSelector.class)导入AutoConfigurationImportSelector
- AutoConfigurationImportSelector有个内部类AutoConfigurationGroup,内部类中process()方法调用getAutoConfigurationEntry(annotationMetadata)使用SpringFactoriesLoader.loadFactoryNames()获取spring.factories中所有自动配置类
- spring.factories中所有自动配置类缓存在Map<String, AnnotationMetadata> entries
到这里spring.factories自动配置类都缓存在map中,究竟是何时调用
现在我们将@Import和spring.factories联系起来:
在梳理@Import原理过程中parse()方法:this.deferredImportSelectorHandler.process()
process()handler.processGroupImports()grouping.getImports()this.group.process()//触发读取spring.factories中配置类,写入Mapthis.group.selectImports()//use map to do something
至此,@Import和spring.factories实现原理已经梳理完毕(后续无非就是拿到类信息,创建对象,不属于这里的范畴),希望能够帮助到读者
彩蛋1:上面是以EnableAutoConfiguration为例子研究spring.factoies,对于
ApplicationContextInitializer看看源码就会找到定义的Initializer
SpringApplication.run(ClientApplication.class)prepareContext()applyInitializers(context)
彩蛋2:为什么当我们引用第三方starter时,可以直接在yml配置一些参数呢,目前只知道,本当前项目的application.yml配置会覆盖第三方yml文件中的配置
@Import和spring.factories实现原理相关推荐
- Spring Boot spring.factories 用法及原理
文章目录 1. spring.factories 用法 2. spring.factories 实现原理 3. spring.factories 用于解决什么问题? 3.1 业务场景思考及 start ...
- SpringBoot解耦的扩展机制 Spring Factories介绍及使用
一.什么是 SPI机制 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的.SPI的全名为Service P ...
- spring.factories 的妙用
现象 在阅读 Spring-Boot 相关源码时,常常见到 spring.factories 文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:"明 ...
- spring.factories机制
spring.factories 在Spring中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的. Java SPI约定 Jav ...
- SpringBoot扩展机制——spring factories
介绍 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照 Java 中的 SPI 扩展机制来实现的.它在META-INF/spring.fac ...
- springboot核心基础之spring.factories机制
引言 在java spring cloud项目中,我们常常会在子模块中创建公共方法,那么在另外一个子模块中,需要加载配置文件的时候,往往Spring Boot 自动扫描包的时候,只会扫描自己模块下的类 ...
- spring.factories 文件配置详情
使用场景 在程序开发中,可能会出现包名不一样的情况(如:pom 依赖的很多的 jar),如何解决Spring Boot不能被默认路径扫描呢? 方法一:在 Spring Boot Application ...
- spring.factories详解
在Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的. Java SPI机制SPI的全名为Service P ...
- Spring Factories机制
Spring Factories机制简述 Spring Factories机制和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多sprin ...
最新文章
- discuz 后台页面开发
- SAP MM 采购价格里的阶梯价格
- 技术管理角色认知-管理都需要做哪些事
- java向Excel文件写入数据
- 《操作系统》OS学习(二):启动、中断、异常
- jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
- 图像数集据增广的15+种功能总结和Python代码实现
- 苹果 Mac 上不显示外置硬盘?9 个必须尝试的修复方法
- Java中od方向是什么意思_od的用法
- 企业管理系统各主要模块简介
- 毕业第一站 | 北京游
- Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
- mac电脑用计算机名共享打印机,MAC与Windows7共享打印机的设置方法
- 通da信股本变迁gbbq权息文件解密
- 《从0到1:CTFer成长之路》1.3 任意文件读取漏洞
- brew install gpg
- mysql安装2503,无法安装msi格式软件提示错误代码2502、2503怎么办?
- Cuil搜尋引擎 挑戰Google
- Mac下chromedriver下载及安装详解
- c语言尾递归,C语言——递归与尾递归
热门文章
- (26)二路插入排序
- 接口自动化测试之pytest用例管理框架
- 【人脸识别】旷世的好用的人脸识别 insightface 使用记录和搭建服务注意点和坑,手把手教你从0到1,太好用了,可以直接运行项目,跟进更新+ffmpeg拉流抽帧
- 服务器主板和普通主板性能,服务器主板和普通主板的区别
- 最小计算机主板,小板称王!VIA正式发布世界最小的x86主板
- Python实现《合成孔径雷达成像——算法与实现》图2.8和2.9
- NFC之基于51单片机rc522的读写
- Restorator 2018 v3.90汉化注册版 含注册码汉化激活教程
- 关于首页能打开,而其他页面404错误,但使用index.php后就能打开的问题
- 设置textarea样式