Я обнаружил различные варианты сканирования моих пакетов на наличие аннотаций, например, здесь:
Общим для этих ответов является то, что мне нужно передать строку, определяющую базовый пакет для сканирования.
В моемприложение, я делаю это уже здесь:
@SpringBootApplication(scanBasePackages = "org.myorg.pro")
и, возможно, в некоторых других @ComponentScan
-аннотациях.
Один из моих компонентов, который может быть найден где-то в этих пакетах в некоторой библиотеке,поиск других классов с аннотацией @MyAwsomeAnnotation
для настройки.
Теперь, если возможно, я бы хотел, чтобы этот компонент использовал какой-либо способ сканирования аннотированных классов в тех же пакетах, что и SpringBootApplication
.
Это то, что я не узнал.
Возможно, есть способ получить эти пути из ApplicationContext?
Подход, с которым я экспериментировал, выглядит так:
- После bean-компонента-фаза строительства, (
@PostConstruct
) используйте ApplicationContext для получения всех Бинов, помеченных @ComponentScan
.Это также извлечет bean-компоненты, аннотированные аннотациями, которые наследуют от @ComponentScan
как @SpringBootApplication
. - Извлекают аннотацию и помещают значение в
Set<String> packages
Проблема в том, что, если бин аннотирован, например, с помощью @SpringBootApplication, я не могу получить аннотацию @ComponentScan, поскольку она на самом деле отсутствует.Поэтому мне нужно знать все наследующие аннотации, поэтому я считаю, что это только подход, а не решение.
@PostConstruct
private void initialize() {
Collection<Object> scanners = context.getBeansWithAnnotation(ComponentScan.class).values();
for (Object scanner : scanners) {
Class clazz = scanner.getClass();
Annotation[] annotations = clazz.getAnnotations();
if(clazz.isAnnotationPresent(ComponentScan.class)) {
ComponentScan annotation = (ComponentScan) clazz.getAnnotation(ComponentScan.class);
packages.addAll(Arrays.asList(annotation.basePackages()));
}
if(clazz.isAnnotationPresent(SpringBootApplication.class)) {
SpringBootApplication annotation = (SpringBootApplication) clazz.getAnnotation(SpringBootApplication.class);
packages.addAll(Arrays.asList(annotation.scanBasePackages()));
}
}
}