尝试重用它是不明智的 scanBasePackages 属性为您自己的目的。如果你看看的来源 @SpringBootApplication 你会看到以下内容:
scanBasePackages
@SpringBootApplication
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {};
这就是说这些属性是别名 @ComponentScan 。由于此注释可用于任何 @Configuration 有这么多的人,实际上是合法的。
@ComponentScan
@Configuration
该 @ComponentScan 注释触发扫描 ConfigurationClassParser 。看着那(这 doProcessConfigurationClass 所有血腥细节的方法。
ConfigurationClassParser
doProcessConfigurationClass
如果您真的想自己找到注释属性,可以执行以下操作:
applicationContext.getBeansWithAnnotation(ComponentScan.class).forEach((name, instance) -> { Set<ComponentScan> scans = AnnotatedElementUtils.getMergedRepeatableAnnotations(instance.getClass(), ComponentScan.class); for (ComponentScan scan : scans) { System.out.println(Arrays.toString(scan.basePackageClasses())); System.out.println(Arrays.toString(scan.basePackages())); } });
这只会给你这两个值。你还没有考虑任何问题 @Condition 注释或任何包含/排除过滤器。你也不会处理 @ComponentScan() 这意味着从当前包中扫描。
@Condition
@ComponentScan()
Spring Boot在这些情况下倾向于为特定目的定义新注释。例如,您可以使用 @EntityScan 定义JPA实体的位置。然后我们使用 AutoConfigurationPackages 如果未指定任何覆盖,则为默认值。
@EntityScan
AutoConfigurationPackages