spring解析配置类
我们知道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解析配置类相关推荐
- 你知道Spring是怎么解析配置类的吗?
Spring执行流程图如下: Spring执行流程图 这个流程图会随着我们的学习不断的变得越来越详细,也会越来越复杂,希望在这个过程中我们都能朝着精通Spring的目标不断前进! 在上篇文章我们学 ...
- Spring 是解析配置类过程详解
Spring执行流程图如下: Spring执行流程图 这个流程图会随着我们的学习不断的变得越来越详细,也会越来越复杂,希望在这个过程中我们都能朝着精通Spring的目标不断前进! 在上篇文章我们学 ...
- SSM框架笔记08:初探Spring——采用配置类与注解方式
初探Spring--采用配置类与注解方式 在上一讲的项目基础上继续. 不仅采用注解方式,而且用配置类替换Spring配置文件. 1.将xml_annotation包里的两个接口和四个类 ...
- spring源码-Springboot解析配置类时,解析配置类的内部类
文章目录 一.ConfigurationClassParser 一.ConfigurationClassParser private void processMemberClasses(Configu ...
- Spring boot配置类
@SpringBootConfiguration 配置类 表示,这是一个Spring boot的配置类 @Target({ElementType.TYPE}) @Retention(Retention ...
- spring.xml配置类属性--喜闻乐见
相信大家在开发的过程中,都会写一些配置文件或者配置类来,毕竟好的编码习惯是不能硬编码的,所以配置文件和配置类就显得很重要了.但是我用久了之后发现,配置文件和配置类确实好用,但是假如有多个配置的话,那么 ...
- Spring导入配置类或文件
第一种 spring.factories 第二种 @Import(Config.class) 第三种 @ImportResource(locations = "classpath:appli ...
- Spring Boot——配置Spring Security配置类DEMO
源代码 package club.zstuca.myzstu.filter;import club.zstuca.myzstu.entity.Resource; import club.zstuca. ...
- Spring源码学习第七天==>解析配置注解类与BPP
关键词: Spring解析配置类注解Bean Spring注册Bean后置增强器(BPP) Spring消息资源和监听器的初始化 一:Spring解析配置类注解Bean==>Configurat ...
最新文章
- 虚拟机在安装svn时 认证密码一直报错_研路同行|安装虚拟机到安装GAMIT教程步骤汇总...
- webpack创建html项目,从零开始其于webpack搭建bootstrap 4项目
- How to Use Git
- 构建之法第一章读后感
- file_get_contents遍历api数据
- mysql 主从复制 有数据库_mysql 数据库一对一主从(master-slave)复制
- jsp mysql 连接池_Tomcat下JSP连接mysql连接池
- 项目结构设计 java_Java项目架构设计
- MyBatis学习(七)
- linux ip地址配置
- 学成在线day13,HLS视频文件处理,FFmpeg,画面清晰度的码率, H5播放器video.js,媒资管理,断点上传文件和合并文件,WebUploader百度上传插件,
- springboot使用j2cache
- modelsim仿真vivado ip核方法
- 神经网络视频/图像渲染相关经典论文、项目、数据集等资源整理分享
- 操作系统OS作业整合
- 使用java进行pdf转word实战
- 青龙魔改助力,突破45ck上限
- 马斯克把飞船方向盘用在特斯拉新车上!乞丐版80万起
- Eric靶机渗透测试
- linux结束后台命令,linux 终端的后台任务结束详解