Сканирование аннотаций в scanBasePackage SpringApplication = {...} - PullRequest
1 голос
/ 23 мая 2019

Я обнаружил различные варианты сканирования моих пакетов на наличие аннотаций, например, здесь:

Общим для этих ответов является то, что мне нужно передать строку, определяющую базовый пакет для сканирования.

В моемприложение, я делаю это уже здесь:

@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()));
        }
    }
}
...