抽象内内部的静态类会被扫描到吗

1.抽象类内部的静态内部类会被spring扫描到吗?

如下面的例子,B会被spring扫描到吗?

1
2
3
4
5
6
7
8
9

public abstract class A {

@Component
public static class B{

}

}

答案是会的
因为静态内部类在编译完成后会产生两个文件,spring扫描时是按照文件扫描的,所以写在抽象类内部的静态类会被扫描到。
可以把静态内部类当成一个独立的类看待,和外部类没什么关系。

2.类全部经名一样的两个类,spring如何处理的?

如果正式代码里和测试代码里存在同样路径,同名的类,spring是如何处理的,他会加载哪个?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<BeanDefinitionHolder>();
for (String basePackage : basePackages) {
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
candidate.setScope(scopeMetadata.getScopeName());
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
if (candidate instanceof AbstractBeanDefinition) {
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
}
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);
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}

上面是ClassPathBeanDefinitionScanner类的源码,按照包名扫描到类,再存入Set里面,如果后面遇到全路径名相同的类,由于是set集合,所以后面的会被忽略。
而扫描的顺序由类加载器决定,一般是classpath路径的先后顺序排序的,写在前面的先被加载到。


抽象内内部的静态类会被扫描到吗
https://www.huangchaoyu.com/2368887570.html
作者
hcy
发布于
2021年1月4日
更新于
2024年8月17日
许可协议