知识点复习38 SpringBoot 自动配置源码分析
启动类加载核心方法load
1.如果是class类型,就启用注解类型
2.如果是resource类型,就使用xmlReader解析
3.如果是package类型,就启用scanner对包进行扫描
4.如果是字符串类型,就直接使用xmlReader进行解析
5.判断source是否是一个component,如果使用component注解,代表是一个bean;就包装成为一个AnnotatedGenericBeanDefinition,也是一个beanDefinition。注册到容器的beanDefinitionMap
装配开始,容器的刷新,调用refresh方法
1.继续调用invokeBeanFactoryPostProcessors
2.继续后面流程,获取ConfigurationClassPostProcessor
后,开始执行BeanDefinitionRegistryPostProcessor
:
3.开始执行自动装配
3.1 循环registry中的beanDefinitionNames,也就是候选的beanDefinition
3.2 如果是配置类ConfigurationClass,就添加到configCandidates里面,然后调用parser.parse进行解析
4.递归调用doProcessConfigurationClass解析,如果有父类,也继续处理
5.
5.1 对属性配置的解析,如果里面还有注解,就继续递归解析注解包含的bean
5.2 继续递归解析import,导入的配置类
5.3 解析导入的xml配置类
5.4 有父类继续递归解析,一直到superClass为空,结束递归
6.开始执行Spring Boot 默认配置逻辑
7.
在获取到springBoot
提供的配置后,再次调用processImports
方法进行递归解析,根据我们自定义的配置文件,进行选择性配置。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ConditionalOnBean
getBeanNamesForType()
方法最终会委托给BeanTypeRegistry
类的getNamesForType
方法来获取对应的指定类型的bean name: