springboot启动时序概要3
2021-06-28 16:48:57 1 举报
登录查看完整内容
第三部分重点介绍了SpringBoot的自动注册机制,例如如何解析配置类,如何处理@Bean等
作者其他创作
大纲/内容
getImportGroup
SpringFactoriesLoader
ImportAwareBeanPostProcessor
ConfigurationClassBeanDefinitionReader
filter(configurations)
configClass.addImportBeanDefinitionRegistrar将Registrar设置到configClass中,后续处理
AutoConfigurationGroup
AutoConfigurationMetadataLoader
doProcessConfigurationClass
Set<ConfigurationClass>
识别配置类
loadMetadata
第三种情况,普通配置类:再次调用processConfigurationClass
DeferredImportSelectorHandler
配置类解析和@Bean注册过程
实例化
PARSE_CONFIGURATION 配置解析阶段
META-INF/spring.factories
loadFactoryNames(AutoConfigurationImportFilter.class)
@EnableAutoConfiguration就是这种情况,此处实现类为AutoConfigurationImportSelector
实例化组容器
第二种情况:registrar
getMetadataReader(clazzName).getAnnotationMetadata
ConfigurationClassUtils
识别配置类:检查是否带有@Configuration注解
META-INF/spring-autoconfigure-metadata.properties
ConditionEvaluator
AutoConfigurationImportFilter
检索逻辑:1.类上必须有@Conditional2.取出该类所有@Conditional的value属性3.根据上述值实例化对应的Condition
process
ConfigurationClassFilter
3.@ComponentScan
和一般ImportSelector即时处理不同,DeferredImportSelector是在所有@Configuration类处理完后执行。除了时延的特点,它还支持分组,组内排序,筛选等功能
DeferredImportSelectorGrouping
getBeanDefinitionNames
match
MetadataReaderFactory
matches
备注:6.处理@ImportResource注解,设置到configClass中7.搜寻自己和接口默认方法,只要出现@Bean即可,设置到configClass中
3.触发监听事件:
ConfigurationClassEnhancer
从BeanDefinition中找到所有配置类交给解析器一般就是启动类DemoAppcation->@ComponentScan->自定义配置类DemoAppcation->@EnableAutoConfiguration->自动配置类DemoAppcation->@EnableXxx->导入自定义配置类
List<Group.Entry>
OnBeanCondition
2.过滤逻辑:读取配置meta属性对,按照以下顺序检查key对应的value,仅检查它对应class文件是否存在1.检查OnClass条件2.检查OnWebAPplication条件3.检查OnBean条件
再次调用processConfigurationClass
onAutoConfigurationImportEven(AutoConfigurationImportEvent)
loadFactories(AutoConfigurationImportListener.class)
loadBeanDefinitions(configClasses)
如果不存在组,则新建
doProcessConfigurationClass主要逻辑:1.循环处理内部类2.处理PropertySource注解,注册至env3.循环处理组件扫描4.循环处理improt配置5.处理超类省略了非递归类处理
将获取到的配置类交给解析器解析
deferredImports集合循环处理
早期过滤机制说明:1.读取元数据属性文件,作为规则map2.候选配置类名称作为匹配key3.根据value对应的class是否存在决定过滤由于conditional条件提前写入了文件中,不需要加载候选类就可以执行过滤,所以加快了启动速度metadata.properties文件是编译自动搜集的,也可以手动填写,详见:https://docs.spring.io/spring-boot/docs/2.2.13.RELEASE/reference/htmlsingle/#boot-features-custom-starter-module-autoconfigure
BeanDefinitionRegistry
OnClassConditionOnWebApplicationConditionOnBeanCondition
shouldSkip(metadata)
和其他步骤不同之处在于,扫描到的组件会立即执行注册,而不是等到后续统一注册猜测:如果不立即注册,那些不是配置类的Bean将被丢弃
5.处理超类doProcessConfigurationClass
add(deferredImport)
getImports
REGISTER_BEAN 注册阶段
springboot启动时序概要(第三部分)
验证配置类是否满足要求,确切的说是否满足ASM类增强的条件,例如class为final,方法是否为private,static,final
getAutoConfigurationEntry
一次调用周期内产生的选择器,只会在本周期内执行完并清空,以避免循环调用时被执行多次
OnBeanCondition 仅在注册阶段生效OnClassConditionOnCloudPlatformConditionOnExpressionConditionOnJavaConditionOnJndiConditionOnPropertyConditionOnPropertyListConditionOnResourceConditionOnWarDeploymentConditionOnWebApplicationCondition
DeferredImportSelectorGroupingHandler
备注:自动配置类全部在此处理。实现机制是依靠一个AutoConfigurationImportSelector的延时选择器,来源:@SpringBootApplication->@EnableAutoConfiguration->AutoConfigurationImportSelector
addBeanPostProcessor
loadFactoryNames(EnableAutoConfiguration.class)
postProcessBeanFactory
注册过程:1.注册自己,如果自己是Imported2.注册自己的@Bean3.注册ImportResource(转交给BeanDefinitionReader处理)4.调用Registrar自定义注册
1.register deferredImport
getConfigurationClasses
Condition
用于分组,这里实际返回AutoConfigurationGroup.class
注册或立即执行
@Configuration注解proxyBeanMethods属性作用:代理@Bean方法,即使在类内部直接调用,也返回容器管理的对象
搜索当前configClass及其所有父类的@Import的value,@Import是允许以不同值重复使用的,所以不能只搜索当前类了事
AutoConfigurationEntry
1.排除逻辑:1.@EnableAutoConfiguration的exclude属性2.@EnableAutoConfiguration的excludeName属性3.环境变量spring.autoconfigure.exclude指定的类名
循环处理每个Entry获取配置候选列表,调用processImports方法
ListableBeanFactory
实例化Class
未返回Class的场景,使用DefaultDeferredImportSelectorGroup.class
getMatchOutcome
循环处理bean定义
ConfigurationClassPostProcessor
parse
实例化(filters)
这是我个人的总结,非常适合想通过源码来探索SpringBoot特性,或者希望更容易理解源码的人查阅如果对你有所帮助的话,请给我点赞哦
1.processMemberClasses
根据@Conditional注解评估是否需要跳过配置
processImports第一种情况以DeferredImportSelector实现为例
AutoConfigurationImportListener
2.processGroupImports
检查是否产生了新配置类,继续解析,直到处理完全部BeanDef配置类以@Bean方法注册,会出现这样情况
DeferredImportSelector
processImports
parse(Set)
匹配逻辑:1.如果是ConfigurationCondition,首先对比Phase2.执行实现类的matches方法
selectImports
checkConfigurationClassCandidate
4.processImports
Configuration.classComponent.classComponentScan.classImport.classImportResource.class含有@Bean方法
再次检索类注解,取出条件,然后判断
2.processPropertySource
ConfigurationClassParser
将选择器依次注册并分组
validate
SpringBoot版本:2.5.0 Spring版本:5.3.7
0 条评论
回复 删除
下一页