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