ConfigurationClassPostProcessor解析流程
2022-06-07 20:07:20 3 举报
ConfigurationClassPostProcessor解析流程
作者其他创作
大纲/内容
@ComponentScan@ComponentScans
1.name2.encoding3.value4.ignoreResourceNotFound5.factory
addPropertySource()
递归processConfigurationClass()
循环importCandidates
判断是否是符合规则的配置类
@ImportResource
AOP动态代理
selector instanceof DeferredImportSelector
enhanceConfigurationClasses(beanFactory)对当前配置类进行增强操作
递归processImports()
doProcessConfigurationClass
创建ConfigurationClassParser解析类
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
parser.parse(candidates)解析操作
从jdk8开始,接口中的方法可以有自己的默认实现,因此如果这个接口的方法加了@Bean注解,也需要被解析
循环遍历判断scannedBeanDefinitions是否是配置类
获取AnnotationMetadata
parser.validate()验证操作
判断candidate.isAssignable(ImportBeanDefinitionRegistrar.class)
对有@Order注解的configCandidates排序
1.locations2.reader
处理@ComponentScan或者@ComponentScans注解,并将扫描包下所有的bean转换成填充后的ConfigurationClass此处就是将自定义的bean加载到IOC容器,因为扫描到的类可能也添加了@ComponentScan或者@ComponentScans注解,因此需要递归解析
@Import
List<BeanDefinitionHolder> configCandidates = new ArrayList<>()创建存放BeanDefinitionHolder的对象集合
递归处理内部类,因为内部类也是一个配置类,配置类上有@Configuration注解,该注解继承了@Component、if判断为true,调用processMemberClasses方法,递归解析配置
循环value数组
processPropertySource(propertySource)
configCandidates.isEmpty()
返回
String[] candidateNames = registry.getBeanDefinitionNames()获取所有已经注册的BeanDefinition的beanName
@PropertySource
Collection<SourceClass> memberClasses = sourceClass.getMemberClasses()找到内部类,内部类也可能是一个配置类
1.判断当前BeanDefinition是否是一个配置类,并为BeanDefinition设置属性为lite或者full,此处设置属性是为了后续进行调用 2.如果configuration配置proxyBeanMethods代理true为full 3.如果加了@Bean、@Component、@ComponentScan、@Import、@ImportSources注解,则设置为lite 4.如果配置类上被@Order注解标注、则设置BeanDefinition的order属性值
OrderComparator.sort(candidates)对配置类进行排序
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates)创建存储相关BeanDefinitionHolder对象的集合
解析父类,如果被解析的配置类继承了某个类,那么配置类的父类也会被进行解析
Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size())存创建存储扫描包下的所有bean的集合
@Component
是
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
循环判断内部类是不是配置类
判断candidate.isAssignable(ImportSelector.class)
CGLI动态代理
@Bean的单例问题
通过上一步扫描包com.baidu,有可能扫描出来的bean中可能也添加了@ComponentScan或者@ComponentScans注解所以这里需要循环遍历一次,进行递归parse(),继续解析,直到解析出来的类上没有@ComponentScan或者@ComponentScans注解
递归调用
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory))
如果bean被@Configuration注解标注,且属性proxyBeanMethods为false(使用代理模式),则将bean定义记为fullif (config != null && !Boolean.FALSE.equals(config.get(\"proxyBeanMethods\
BeanFactoryPostProcessor
将解析万的Configuration配置leukemia进行校验,1.配置类不能是final2.@Bean修饰的方法必须可以支持重写以支持CGLIB
遍历符合规则的类
解析带有@Controller、@Import、@ImportResource、@ComponentScan、@ComponentScans、@Bean的BeanDefinition
直接忽略
processConfigurationClass()
BeanDefinitionRegistryPostProcessor
@Bean
@Configurationpublic class Configuration(){ @Bean public Bean getBean(){ return new Bean(); }}
processConfigBeanDefinitions(registry)处理配置类的解析信息
否
将@Bean方法转换为BeanMethod对象,保存在集合中
ConfigurationClassPostProcessor
收藏
0 条评论
下一页