Spring解析配置类
2024-10-28 14:34:58 0 举报
AI智能生成
Spring解析配置类
作者其他创作
大纲/内容
找出配置类,放入一个集合中
获取目前容器中的所有beanDefinition并遍历
获取注解信息
存在@Configuration,并且proxyBeanMethods不为false(为true或为null)时,就是Full配置类
存在@Configuration,并且proxyBeanMethods为false时,是lite配置类
或者不存在@Configuration,但是只要存在@Component、@ComponentScan、@Import、@ImportResource四个中的一个,就是lite配置类
或者不存在@Configuration,只要存在@Bean注解了的方法,就是lite配置类
或者不存在@Configuration,只要存在@Bean注解了的方法,就是lite配置类
把所有是配置类beanDefinition放入一个List集合configCandidates中并且按照@Order排序
创建ConfigurationClassParser对象,作为下一步解析配置类的解析器
遍历解析配置类
解析之前,把BeanDefinition转换成ConfigurationClass对象
条件注解,就是看有没有类上是否有@Conditional注解,如果有,则进行条件匹配,使用ConditionEvaluator类来进行解析
处理内部类
在解析一个配置类时,如果类上有@Component,则会判断内部类是不是lite配置类并进行解析,并且会记录为被导入的
处理@PropertySources注解
如果有@PropertySources注解则进行处理,得到PropertySource对象,并添加到environment中
处理@ComponentScan注解
如果有@ComponentScan会进行扫描,得到BeanDefinition会注册到Spring容器中,并且会检查是不是配置类并进行解析
处理@Import注解
如果导入的是普通类,那么会直接把它当做配置类来解析
如果导入的是普通ImportSelector,那么会将返回的类再次调用processImports()
如果导入的是特殊ImportSelector,DeferredImportSelector,那么暂时不会处理,会在解析完所有当前这轮配置类后进行导入,将返回的类再次调用processImports()
如果导入的是ImportBeanDefinitionRegistrar,那么暂时不会处理,会在解析完所有当前这轮配置类后,将配置类解析成为BeanDefinition之后进行调用
处理@ImportResource注解
如果存在则把导入进来的资源路径存在配置类对象中的importedResources属性中
处理@Bean注解
解析配置类中的@Bean,但并没有真正处理@Bean,只是暂时找出来
解析配置类所实现的接口中的@Bean,但并没有真正处理@Bean,只是暂时找出来
处理父类
如果存在父类则返回父类并解析父类,如果不存在则返回null
处理deferredImportSelectors
处理deferredImportSelectors,表示当前所有配置类解析完了之后才执行
deferredImportSelector表示推迟的ImportSelector,正常的ImportSelector是在解析配置类的过程中执行的
处理其他的ConfigurationClass
一个配置类会对应一个ConfigurationClass,也会生成另外的一些ConfigurationClass,利用reader来进一步解析ConfigurationClass
如果ConfiguationClass是通过@Import注解导入进来的,则把这个类生成一个BeanDefinition,同时解析这个类上@Scope,@Lazy等注解,并注册BeanDefinition
如果ConfigurationClass存在一些BeanMethod,也就是定义了一些@Bean,那么则解析这些@Bean,并生成对应的BeanDefinition并注册
如果ConfigurationClass导入了一些资源文件,比如xx.xml,那么解析这些xx.xml文件,得到并注册BeanDefinition
如果ConfigurationClass导入了一些ImportBeanDefinitionRegistrar,那么则执行对应的registerBeanDefinitions进行BeanDefinition的注册
0 条评论
下一页