代码拉取完成,页面将自动刷新
同步操作将从 蓝色调调/Spring-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
类全路径: org.springframework.context.annotation.ClassPathBeanDefinitionScanner
类作用: 扫描输入的 包路径进行组件注册
public class ClassPathBeanDefinitionScanner extends ClassPathScanningCandidateComponentProvider {
/**
* bean定义注册器
*/
private final BeanDefinitionRegistry registry;
/**
* bean 定义的默认值
*/
private BeanDefinitionDefaults beanDefinitionDefaults = new BeanDefinitionDefaults();
/**
* 候选对象名称列表(名称匹配模式)
*/
@Nullable
private String[] autowireCandidatePatterns;
/**
* BeanName 生成器
*/
private BeanNameGenerator beanNameGenerator = AnnotationBeanNameGenerator.INSTANCE;
/**
* 作用域解析器(解析作用域元数据)
*/
private ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver();
/**
* 是否包含注解的配置信息
*/
private boolean includeAnnotationConfig = true;
}
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#scan
public int scan(String... basePackages) {
// 在执行扫描方法前beanDefinition的数量
int beanCountAtScanStart = this.registry.getBeanDefinitionCount();
// 真正的扫描方法
doScan(basePackages);
// 是否需要注册 注解的配置处理器
// Register annotation config processors, if necessary.
if (this.includeAnnotationConfig) {
// 注册注解后置处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
// 当前 BeanDefinition 数量 - 历史 B
return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart);
}
doScan
方法中方法签名: org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
处理逻辑
findCandidateComponents
), 搜索方法在ClassPathScanningCandidateComponentProvider中setScope
分析文章
postProcessBeanDefinition
AnnotationConfigUtils.processCommonDefinitionAnnotations
,AnnotationConfigUtils
checkCandidate
registerBeanDefinition
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
// bean 定义持有器列表
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
// 循环包路径进行扫描
for (String basePackage : basePackages) {
// 搜索可能的组件. 得到 组件的BeanDefinition
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
// 循环候选bean定义
for (BeanDefinition candidate : candidates) {
// 获取 作用域元数据
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
// 设置作用域
candidate.setScope(scopeMetadata.getScopeName());
// beanName 生成
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
// 类型判断 AbstractBeanDefinition
if (candidate instanceof AbstractBeanDefinition) {
// bean 定义的后置处理
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
}
// 类型判断 AnnotatedBeanDefinition
if (candidate instanceof AnnotatedBeanDefinition) {
// 通用注解的处理
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
}
// 候选检测
if (checkCandidate(beanName, candidate)) {
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
// 作用于属性应用
definitionHolder =
AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
beanDefinitions.add(definitionHolder);
// 注册 bean定义
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}
方法签名: org.springframework.context.annotation.ClassPathBeanDefinitionScanner#postProcessBeanDefinition
方法作用: 设置默认值信息
protected void postProcessBeanDefinition(AbstractBeanDefinition beanDefinition, String beanName) {
// 应用默认值
beanDefinition.applyDefaults(this.beanDefinitionDefaults);
if (this.autowireCandidatePatterns != null) {
// 设置 autowireCandidate 模式
// AUTOWIRE_BY_TYPE 或者 AUTOWIRE_BY_NAME
beanDefinition.setAutowireCandidate(PatternMatchUtils.simpleMatch(this.autowireCandidatePatterns, beanName));
}
}
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#checkCandidate
主线流程如下
existingDef
或者 originatingDef
是否对参数 beanDefinition
兼容
protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException {
// 当前注册器中是否包含 beanName
if (!this.registry.containsBeanDefinition(beanName)) {
return true;
}
// 注册器中的 beanName 的 beanInstance
BeanDefinition existingDef = this.registry.getBeanDefinition(beanName);
BeanDefinition originatingDef = existingDef.getOriginatingBeanDefinition();
if (originatingDef != null) {
existingDef = originatingDef;
}
// 两个对象是否兼容
if (isCompatible(beanDefinition, existingDef)) {
return false;
}
throw new ConflictingBeanDefinitionException("Annotation-specified bean name '" + beanName +
"' for bean class [" + beanDefinition.getBeanClassName() + "] conflicts with existing, " +
"non-compatible bean definition of same name and class [" + existingDef.getBeanClassName() + "]");
}
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#isCompatible
protected boolean isCompatible(BeanDefinition newDefinition, BeanDefinition existingDefinition) {
// 1. 是否是 ScannedGenericBeanDefinition 类型
// 2. source 是否相同
// 3. 参数是否相同
return (!(existingDefinition instanceof ScannedGenericBeanDefinition) || // explicitly registered overriding bean
(newDefinition.getSource() != null && newDefinition.getSource().equals(existingDefinition.getSource())) || // scanned same file twice
newDefinition.equals(existingDefinition)); // scanned equivalent class twice
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。