Spring Framework ConfigurationClassPostProcessor
2020-04-16 11:20:57 0 举报
Spring ConfigurationClassPostProcessor 流程图分析
作者其他创作
大纲/内容
processConfigurationClass()处理 Import 直接导入的 bean,暂时先添加到 configurationClasses 属性中
③ doProcessConfigurationClass()处理配置类
loadBeanDefinitionsFromRegistrars()处理 【ImportBeanDefinitionRegistrar】这种类型,即回调 registerBeanDefinitions() 方法,完成手动注册
loadBeanDefinitions()调用 loadBeanDefinitions() 方法进行注册 beanDefinitionMap 属性
componentScanParser.parse()处理 @ComponentScans、@ComponentScan 注解扫描出来的 bean 信息,直接存储到 beanDefinitionMap 中
importBeanDefinitionRegistrars存储【ImportBeanDefinitionRegistrar 】类型
parse()解析注解对象
存储
递归调用
selectImports()处理 ImportSelector 情况,回调 selectImports() 方法,然后继续调用 processImports() 方法处理 bean
② newEnhancer()创建 Enhancer 类
如果有以下注解:@Configuration、@Component、@ComponentScan、@Import、@ImportResource、@Bean,就作为配置类解析
⑤ loadBeanDefinitionsForConfigurationClass()这里是循环所有的 configurationClasses,挨个调用上面的方法进行处理
④ processImports()处理 @Import 注解,这里有三种情况:@Import 普通类、ImportSelector、ImportBeanDefinitionRegistrar
ConfigurationClassPostProcessor.postProcessBeanFactory()它是 BeanFactory 的后置处理器,所以会回调这个方法
获取
① processConfigBeanDefinitions()处理 BeanDefinitionRegistry 中的类
registerBeanDefinitionForImportedConfigurationClass()如果 bean 是被 isImported 的,就调用这个方法注册到 beanDefinitionMap 属性中
configurationClasses 存储 new 出来的 ConfigurationClass,最终转换成 BeanDefinition,然后注册
// 设置父类,cglib 是基于继承 enhancer.setSuperclass(configSuperClass); // 设置接口,EnhancedConfiguration 继承了 BeanFactoryAware 接口,是为了实现 setBeanFactory() 方法获取 beanFactory enhancer.setInterfaces(new Class<?>[] {EnhancedConfiguration.class}); // 设置 cglib 生成类的策略,主要添加一个自定义的属性 $$beanFactory enhancer.setStrategy(new BeanFactoryAwareGeneratorStrategy(classLoader)); // CALLBACK_FILTER 中包含三个拦截器,如下: // 1. BeanMethodInterceptor() -> bean 方法拦截器,不需要每一次都创建对象 // 2. BeanFactoryAwareMethodInterceptor() -> 给 $$beanFactory 属性赋值 // 3. NoOp.INSTANCE -> 无作用
loadBeanDefinitionsForBeanMethod()如果是被 @Bean 注解标注的,调用这个方法注册到 beanDefinitionMap 属性中
loadBeanDefinitionsFromImportedResources()处理 @ImportResource 注解导入的 xml 文件
beanDef.setBeanClass(enhancedClass)修改 BeanDefinition 的 class 字节码信息,所以以后就会创建出代理对象
retrieveBeanMethodMetadata()处理 @Bean 注解
parser.parse(candidates)解析前面步骤筛选出来的配置类
enhancer.enhance()使用 cglib 做增强处理
isFullConfigurationClass()筛选出被 @Configuration 注解的配置类
addImportedResource()处理 @ImportResource 注解
createClass()创建代理类
addImportBeanDefinitionRegistrar()处理 ImportBeanDefinitionRegistrar 情况,暂时先添加到 importBeanDefinitionRegistrars 属性中
processPropertySource()处理 @PropertySources 注解
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()它是 BeanFactory 的后置处理器,所以会回调这个方法
checkConfigurationClassCandidate()筛选配置类
② processConfigurationClass()处理配置类
① enhanceConfigurationClasses()判断是否需要对配置类做代理增强
0 条评论
下一页