Не рекомендуется пытаться повторно использовать атрибуты scanBasePackages
для своих собственных целей.Если вы посмотрите на источник @SpringBootApplication
, то увидите следующее:
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
Это говорит о том, что эти атрибуты являются псевдонимом для @ComponentScan
.Поскольку эту аннотацию можно использовать в любом классе @Configuration
, на самом деле их много.
Аннотация @ComponentScan
запускает сканирование с помощью 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()
, что означает сканирование из текущего пакета вниз.
Что Spring Boot имеет тенденцию делать в этих обстоятельствах, так это определить новую аннотацию для конкретной цели.Например, вы можете использовать @EntityScan
, чтобы определить, где находятся объекты JPA.Затем мы используем AutoConfigurationPackages
в качестве значения по умолчанию, если вы не указали переопределение.