本篇文章主要记录@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实现原理相关推荐

  1. Spring Boot spring.factories 用法及原理

    文章目录 1. spring.factories 用法 2. spring.factories 实现原理 3. spring.factories 用于解决什么问题? 3.1 业务场景思考及 start ...

  2. SpringBoot解耦的扩展机制 Spring Factories介绍及使用

    一.什么是 SPI机制 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的.SPI的全名为Service P ...

  3. spring.factories 的妙用

    现象 在阅读 Spring-Boot 相关源码时,常常见到 spring.factories 文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:"明 ...

  4. spring.factories机制

    spring.factories 在Spring中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的. Java SPI约定 Jav ...

  5. SpringBoot扩展机制——spring factories

    介绍 Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照 Java 中的 SPI 扩展机制来实现的.它在META-INF/spring.fac ...

  6. springboot核心基础之spring.factories机制

    引言 在java spring cloud项目中,我们常常会在子模块中创建公共方法,那么在另外一个子模块中,需要加载配置文件的时候,往往Spring Boot 自动扫描包的时候,只会扫描自己模块下的类 ...

  7. spring.factories 文件配置详情

    使用场景 在程序开发中,可能会出现包名不一样的情况(如:pom 依赖的很多的 jar),如何解决Spring Boot不能被默认路径扫描呢? 方法一:在 Spring Boot Application ...

  8. spring.factories详解

    在Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的. Java SPI机制SPI的全名为Service P ...

  9. Spring Factories机制

    Spring Factories机制简述 Spring Factories机制和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多sprin ...

最新文章

  1. discuz 后台页面开发
  2. SAP MM 采购价格里的阶梯价格
  3. 技术管理角色认知-管理都需要做哪些事
  4. java向Excel文件写入数据
  5. 《操作系统》OS学习(二):启动、中断、异常
  6. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
  7. 图像数集据增广的15+种功能总结和Python代码实现
  8. 苹果 Mac 上不显示外置硬盘?9 个必须尝试的修复方法
  9. Java中od方向是什么意思_od的用法
  10. 企业管理系统各主要模块简介
  11. 毕业第一站 | 北京游
  12. Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
  13. mac电脑用计算机名共享打印机,MAC与Windows7共享打印机的设置方法
  14. 通da信股本变迁gbbq权息文件解密
  15. 《从0到1:CTFer成长之路》1.3 任意文件读取漏洞
  16. brew install gpg
  17. mysql安装2503,无法安装msi格式软件提示错误代码2502、2503怎么办?
  18. Cuil搜尋引擎 挑戰Google
  19. Mac下chromedriver下载及安装详解
  20. c语言尾递归,C语言——递归与尾递归

热门文章

  1. (26)二路插入排序
  2. 接口自动化测试之pytest用例管理框架
  3. 【人脸识别】旷世的好用的人脸识别 insightface 使用记录和搭建服务注意点和坑,手把手教你从0到1,太好用了,可以直接运行项目,跟进更新+ffmpeg拉流抽帧
  4. 服务器主板和普通主板性能,服务器主板和普通主板的区别
  5. 最小计算机主板,小板称王!VIA正式发布世界最小的x86主板
  6. Python实现《合成孔径雷达成像——算法与实现》图2.8和2.9
  7. NFC之基于51单片机rc522的读写
  8. Restorator 2018 v3.90汉化注册版 含注册码汉化激活教程
  9. 关于首页能打开,而其他页面404错误,但使用index.php后就能打开的问题
  10. 设置textarea样式