我们知道spring在启动的过程中,会调用refresh()方法,而refresh()方法会调用invokeBeanFactoryPostProcessors(beanFactory);通过方法名称可以知道其实就是执行BeanFactoryPostProcessor,它在spring中是一个BeanFactory的后置处理器,作用是对BeanFactory进行加工。但是spring启动到这里,beanFactory中只有一个BeanFactoryPostProcessor,就是ConfigurationClassPostProcessor,而解析配置类的过程就是调用这个类的postProcessBeanDefinitionRegistry()方法实现的。

解析配置类流程

1、书写以下配置类代码,启动spring;首先从beanFactory中拿到所有的BeanDefinition,判断是否存在配置类,不存在直接返回,存在就添加到一个集合中。

@ComponentScan("com.xxx")
public class AppConfig {}

什么是配置类?

(1)存在@Configuration(full配置类)

(2)不存在@Configuration,但是存在@Component、@ComponentScan、@Import、@ImportResource四个中的一个就是配置类(lite配置类)

(3)不存在@Configuration,只要类中存在@Bean注解了的方法(就是lite配置类)

(4)存在@Configuration,但是其属性proxyBeanMethods=false,是lite配置类

2、对配置类集合进行排序。通过@Orderd排序,数值越小在前面

3、创建ConfigurationClassParser对象,用来解析ConfigurationClass(配置类对象)

4、把类的元信息和beanName封装成ConfigurationClass;判断是否有@Conditional注解(这里不清楚)

5、判断配置类上是否存在@Component注解,存在就去找内部类是否也是配置类,并解析

6、如果配置类中存在@PropertySources注解,这个注解可以导入一个文件,并将文件中内容解析到容器中environment中

7、如果存在@ComponentScans,或者@ComponentScan注解,则进行扫描,扫描到符合条件的类会被解析为BeanDefinition,并注册到spring容器中去。这里判断扫描出来的是不是配置类,如果是,则进行递归。

8、如果配置类上存在@Import注解,

(1)如果导入的是普通的类,直接把它当成配置类来解析,也就是解析成BeanDefinition

(2)如果导入的是普通ImportSelector,则调用其接口方法selectImports(),并将返回结果spring数组解析为BeanDefinition,注册到spring容器中去

(3)如果导入的是DeferredImportSelector,那么会延迟执行接口方法。最后会在所有配置类解析完成之后执行接口方法selectImports()

(4)如果导入的是ImportBeanDefinitionRegistrar类,则加载这个类并生成一个实例对象,添加到ConfigurationClass的属性importBeanDefinitionRegistrars集合中。其中集成mybatis就是他的功能。

9、处理@ImportResource,拿到导入的资源路径和BeanDefinition读取器,添加到ConfigurationClass的属性importedResources集合中

10、解析@Bean,解析配置类中所有的@Bean注解的方法,封装为BeanMethod对象,添加配置类中beanMethods属性中

11、解析配置类中实现的接口中的@Bean方法,并没有真正处理,只是找出来,也是添加配置类中beanMethods属性中

12、解析配置类中的父类,添加到knownSuperclasses属性中。

13、处理@Import所导入的类,@Bean,@ImportResource,实现ImportBeanDefinitionRegistrar(8,9,10,11)中解析出来的类并解析为BeanDefinition并注册到spring容器中去

14、如果发现BeanDefinition增加了,则有可能增加了配置类,继续解析配置类

BeanFactoryPostProcessor的执行顺序

1. 执行手动添加的BeanDefinitionRegistryPostProcessor 的postProcessBeanDefinitionRegistry()方法

2. 执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了PriorityOrdered)的postProcessBeanDefinitionRegistry()方法--------解析配置类

3. 执行扫描出来的BeanDefinitionRegistryPostProcessor(实现了Ordered) 的postProcessBeanDefinitionRegistry()方法

4. 执行扫描出来的BeanDefinitionRegistryPostProcessor(普通) 的postProcessBeanDefinitionRegistry()方法

5. 执行扫描出来的BeanDefinitionRegistryPostProcessor(所有) 的postProcessBeanFactory()方法

6. 执行手动添加的BeanFactoryPostProcessor 的postProcessBeanFactory()方法

7. 执行扫描出来的BeanFactoryPostProcessor(实现了PriorityOrdered) 的postProcessBeanFactory()方法

8. 执行扫描出来的BeanFactoryPostProcessor(实现了Ordered) 的postProcessBeanFactory()方法

9. 执行扫描出来的BeanFactoryPostProcessor(普通) 的postProcessBeanFactory()方法 *

spring解析配置类相关推荐

  1. 你知道Spring是怎么解析配置类的吗?

    Spring执行流程图如下: Spring执行流程图 这个流程图会随着我们的学习不断的变得越来越详细,也会越来越复杂,希望在这个过程中我们都能朝着精通Spring的目标不断前进!  在上篇文章我们学 ...

  2. Spring 是解析配置类过程详解

    Spring执行流程图如下: Spring执行流程图 这个流程图会随着我们的学习不断的变得越来越详细,也会越来越复杂,希望在这个过程中我们都能朝着精通Spring的目标不断前进!  在上篇文章我们学 ...

  3. SSM框架笔记08:初探Spring——采用配置类与注解方式

      初探Spring--采用配置类与注解方式   在上一讲的项目基础上继续.   不仅采用注解方式,而且用配置类替换Spring配置文件.   1.将xml_annotation包里的两个接口和四个类 ...

  4. spring源码-Springboot解析配置类时,解析配置类的内部类

    文章目录 一.ConfigurationClassParser 一.ConfigurationClassParser private void processMemberClasses(Configu ...

  5. Spring boot配置类

    @SpringBootConfiguration 配置类 表示,这是一个Spring boot的配置类 @Target({ElementType.TYPE}) @Retention(Retention ...

  6. spring.xml配置类属性--喜闻乐见

    相信大家在开发的过程中,都会写一些配置文件或者配置类来,毕竟好的编码习惯是不能硬编码的,所以配置文件和配置类就显得很重要了.但是我用久了之后发现,配置文件和配置类确实好用,但是假如有多个配置的话,那么 ...

  7. Spring导入配置类或文件

    第一种 spring.factories 第二种 @Import(Config.class) 第三种 @ImportResource(locations = "classpath:appli ...

  8. Spring Boot——配置Spring Security配置类DEMO

    源代码 package club.zstuca.myzstu.filter;import club.zstuca.myzstu.entity.Resource; import club.zstuca. ...

  9. Spring源码学习第七天==>解析配置注解类与BPP

    关键词: Spring解析配置类注解Bean Spring注册Bean后置增强器(BPP) Spring消息资源和监听器的初始化 一:Spring解析配置类注解Bean==>Configurat ...

最新文章

  1. 虚拟机在安装svn时 认证密码一直报错_研路同行|安装虚拟机到安装GAMIT教程步骤汇总...
  2. webpack创建html项目,从零开始其于webpack搭建bootstrap 4项目
  3. How to Use Git
  4. 构建之法第一章读后感
  5. file_get_contents遍历api数据
  6. mysql 主从复制 有数据库_mysql 数据库一对一主从(master-slave)复制
  7. jsp mysql 连接池_Tomcat下JSP连接mysql连接池
  8. 项目结构设计 java_Java项目架构设计
  9. MyBatis学习(七)
  10. linux ip地址配置
  11. 学成在线day13,HLS视频文件处理,FFmpeg,画面清晰度的码率, H5播放器video.js,媒资管理,断点上传文件和合并文件,WebUploader百度上传插件,
  12. springboot使用j2cache
  13. modelsim仿真vivado ip核方法
  14. 神经网络视频/图像渲染相关经典论文、项目、数据集等资源整理分享
  15. 操作系统OS作业整合
  16. 使用java进行pdf转word实战
  17. 青龙魔改助力,突破45ck上限
  18. 马斯克把飞船方向盘用在特斯拉新车上!乞丐版80万起
  19. Eric靶机渗透测试
  20. linux结束后台命令,linux 终端的后台任务结束详解

热门文章

  1. 抄360一个关键的洁净实现(一)
  2. 鱼刺 winhttp
  3. Python实现9x9方格数独求解小工具
  4. 闭关之 C++ 函数式编程笔记(四):monad 和 模板元编程
  5. macbook win10启动时一直在转圈的故障解决
  6. 特岗计算机考试面试,特岗教师面试
  7. 基于MVC的简易留言板
  8. SQL增删改查学习(一)
  9. 改变世界的数学公式,yyds
  10. 杨顾算法 matlab,杨兴——MATLAB/Simulink让高深的知识变得生动