Spring配置类解析流程
2022-10-14 09:20:10 0 举报
登录查看完整内容
配置类的解析,以及各种beanPostProcessor的执行
作者其他创作
大纲/内容
ImportBeanDefinitionRegistrar
解析配置类
是否存在内部类
ComponentScanAnnotationParser#parse
处理@Bean注解
判断class的类型
递归父类
如果发现BeanDefinition增加了,则有可能增加了配置类
生成ImportBeanDefinitionRegistrar对应实例化对象
存在配置类
拿出所有ConfigurationClass
parser.getConfigurationClasses()
遍历未被处理的ConfigurationClass
ConfigurationClassParser#processImports#递归调用处理所导入的类
添加到ConfigurationClass的importBeanDefinitionRegistrars
通过@Order可以排序,升序排序,order越小越靠前
如果当前ConfigurationClass是通过@Import导入进来的,则通过importBeanNameGenerator.generateBeanName生成一个BeanName,并生成一个BeanDefinition注册到BeanFactory中去
BeanDefinition覆盖:1、@Component 相同名字会报错org.springframework.context.annotation.ClassPathBeanDefinitionScanner#checkCandidate 2、@Bean 会覆盖 @Bean的方法名称不能和配置类名称相同3、@Bean 和@Componentt 允许覆盖,最后会以@Bean的信息为准(@Bean最后创建BeanDefinition)
#处理如果当前ConfigurationClass的beanMethods那么则通过该方法生成BeanDefinition并注册
ConfigurationClassParser#processConfigurationClass#递归调用,处理配置类
ConfigurationClassPostProcessor#processConfigBeanDefinitions
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
处理当前ConfigurationClass的importedResources属性,解析所导入的xml文件
是否存在@Component.class
ImportSelector
判断是否配置类
是
添加到ConfigurationClass的deferredImportSelectors
配置类的解析器
执行selectImports方法
实例化
拿出所有的beanDefinition去检查是否配置类
解析出@PropertySource注解所配置的Properties文件路径,封装为Properties对象并添加到Environment中
进行实例化
遍历BeanDefinition
DeferredImportSelector.class
处理@PropertySource注解
处理配置类所实现的接口中的@Bean
遍历多个componentScans
遍历所有内部类
把导入的资源路径添加到ConfigurationClass的importedResources
递归调用processConfigurationClass,处理当前配置类,会把这些类添加到ConfigurationClass
ConfigurationClassParser#parse()
普通的类
得到多个类
selector.selectImports(currentSourceClass.getMetadata())
扫描出BeanDefinition得到的BeanDefinition会注册到Spring容器中
处理@ImportResource注解
处理deferredImportSelectors
new ConfigurationClassParser()
检查是否为配置类
1、@Bean定义的配置类Bean是不起作用的2、存在@Configuration,并且proxyBeanMethods不为false(为true或为null)时,就是Full配置类3、存在@Configuration,并且proxyBeanMethods为false时,是lite配置类4、或者不存在@Configuration,但是只要存在@Component、@ComponentScan、@Import、@ImportResource四个中的一个,就是lite配置类5、或者不存在@Configuration,只要存在@Bean注解了的方法,就是lite配置类
添加到ConfigurationClass的beanMethods
ParserStrategyUtils.instantiateClass()
ConfigurationClassParser#processConfigurationClass#解析配置类
处理当前ConfigurationClass的importBeanDefinitionRegistrars属性,执行registerBeanDefinitions方法进行BeanDefinition的注册
处理@ComponentScans注解
ConfigurationClassParser#processImports#处理所导入的类
内部类是不是lite配置类
处理@Import注解
selector
0 条评论
回复 删除
下一页