Spring 包扫描器ClassPathBeanDefinitionScanner
2023-01-31 15:49:06 2 举报
Spring启动过程中包扫描器 ClassPathBeanDefinitionScanner
作者其他创作
大纲/内容
如果不是同一个,表示不同的Bean名称重复,抛出ConflictingBeanDefinitionException异常
true
遍历resources
basePackages
当前bean是否在BeanDefinitionMap中,不存在则返回truecontainsBeanDefinition(beanName)
返回候选beanDefinitionreturn candidates
for (BeanDefinition candidate : candidates)
for (Resource resource : resources)
定义扫描BeanDefinition结果集合Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
return true;
checkCandidate()
遍历数组
设置bean作用域获取bean名字candidate.setScope();generateBeanName
候选beanDefinition candidates
definitionHolder
Set<BeanDefinition> candidates = new LinkedHashSet<>();
for (String basePackage : basePackages)
设置beanDefinition中默认属性,如:初始化方法、属性注入模式、lazy等
扫描包下的所有类,筛选出候选的BeanDefinitionSet<BeanDefinition> candidates = findCandidateComponents(basePackage);
false
解析出当前包所在类路径packageSearchPath
创建候选beanDefinitionScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
注册bean到BeandefinitionMapregisterBeanDefinition()
new BeanDefinitionHolder()beanDefinitions.add(definitionHolder);
findCandidateComponents(basePackage)
根据排除(excludeFilters)和包含规则(includeFilters)过滤类
遍历数组basePackages
isCandidateComponent(metadataReader)
通过资源读取器,读取当前包路径下的所有类资源Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
candidates数组是否遍历完
读取类元数据信息MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
resources是否遍历完
return false
scanCandidateComponents(basePackage);
doScan(String... basePackages)
candidates.add(sbd);
判断当前类是否能成为Beanif(isCandidateComponent(metadataReader))
包路径数组是否遍历完
校验当前BeanDefinition是否能被注册if(checkCandidate())
return beanDefinitions;
0 条评论
下一页