Spring框架配置类后置处理器
2022-03-13 20:27:47 0 举报
AI智能生成
Spring ConfigurationClassPostProcessor 处理流程
作者其他创作
大纲/内容
postProcessBeanDefinitionRegistry()
它是 BeanFactoryPostProcessor 处理器,所以会回调这个方法
processConfigBeanDefinitions()
此时 registry 中已经注册了部分 BeanDefinition
从容器中循环所有 BeanDefinition,解析出配置类【SpringConfig】 checkConfigurationClassCandidate
解析配置类,判断是 full 模式还是 lite 模式
解析配置类,判断是 full 模式还是 lite 模式
将这些配置类根据 Order 排序
parser.parse(candidates)
解析前面步骤筛选出来的配置类
parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName())
继续解析
processConfigurationClass()
继续解析
继续解析
doProcessConfigurationClass()
处理配置类
processMemberClasses()
处理 @Component 注解
处理 @Component 注解
PropertySource()
处理 @PropertySources、@PropertySources 注解
处理 @PropertySources、@PropertySources 注解
包扫描处理
考虑到扫描过程中可能还会遇到 config 配置类
所以这里会把所有已解析的类进行校验是否是 config 配置类
如果是配置类,那么会再次调用 parse() 进行解析
考虑到扫描过程中可能还会遇到 config 配置类
所以这里会把所有已解析的类进行校验是否是 config 配置类
如果是配置类,那么会再次调用 parse() 进行解析
componentScanParser.parse()
处理 @ComponentScans、@ComponentScan 注解
处理 @ComponentScans、@ComponentScan 注解
scanner.doScan()
根据 basePackage 获取到所有扫描到的组件
注册到 Spring 的【beanDefinitionMap】工厂中
根据 basePackage 获取到所有扫描到的组件
注册到 Spring 的【beanDefinitionMap】工厂中
findCandidateComponents()
查找到所有的候选组件
查找到所有的候选组件
scanCandidateComponents()
真正的扫描处理,可以根据各种过滤器进行筛选
并最终将符合条件的类转成 BeanDefinition 返回
真正的扫描处理,可以根据各种过滤器进行筛选
并最终将符合条件的类转成 BeanDefinition 返回
processImports()
处理 @Import 注解
处理 @Import 注解
addImportedResource()
处理 @addImportedResource 注解
处理 @addImportedResource 注解
retrieveBeanMethodMetadata()
处理 @Bean 注解
处理 @Bean 注解
configurationClasses
添加到中 map 集合中,后面的步骤会处理
添加到中 map 集合中,后面的步骤会处理
this.reader.loadBeanDefinitions(configClasses)
循环处理所有的配置类
loadBeanDefinitionsForConfigurationClass()
处理配置类
registerBeanDefinitionForImportedConfigurationClass()
如果类是被 @Import 导入的,就注册到【beanDefinitionMap】中
loadBeanDefinitionsForBeanMethod()
把被 @Bean 注解标注的方法注册到【beanDefinitionMap】中
loadBeanDefinitionsFromImportedResources()
处理 @ImportResource 注解导入的 xml 文件
loadBeanDefinitionsFromRegistrars()
处理 【ImportBeanDefinitionRegistrar】类型
registerBeanDefinitions()
回调 ImportBeanDefinitionRegistrar 的 registerBeanDefinitions() 方法
相当于交给用户自己注册
回调 ImportBeanDefinitionRegistrar 的 registerBeanDefinitions() 方法
相当于交给用户自己注册
postProcessBeanFactory()
它是 BeanFactoryPostProcessor 处理器,所以会回调这个方法
enhanceConfigurationClasses()
判断是否需要对配置类做代理增强
判断依据为是不是 full 模式 isFullConfigurationClass()
筛选出被 @Configuration 注解的配置类
enhancer.enhance(configClass, this.beanClassLoader)
使用 cglib 做增强处理
使用 cglib 做增强处理
newEnhancer(configClass, classLoader)
创建 Enhancer 类
BeanMethodInterceptor
方法拦截器分析
方法拦截器分析
BeanFactoryAwareMethodInterceptor
createClass()
创建代理类
代理类分析
0 条评论
下一页