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路径的先后顺序排序的,写在前面的先被加载到。