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

Posted by hcy on January 4, 2021

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/2021/01/04/抽象内内部的静态类会被扫描到吗/