С помощью Spring вы можете создавать некоторые аннотации. Ярким примером является @SpringBootApplication - аннотация, которая представляет собой совокупность @Configuration, @EnableAutoConfiguration и @ComponentScan.

Я пытаюсь получить все Бины, на которые влияет определенная аннотация, т.е. ComponentScan.

После этого ответа я использую следующий код:

for (T o : applicationContext.getBeansWithAnnotation(ComponentScan.class).values()) {
    ComponentScan ann = (ComponentScan) o.getClass().getAnnotation(ComponentScan.class);
    ...
}

Который не работает, поскольку не все bean-компоненты, возвращаемые getBeansWithAnnotation(ComponentScan.class), действительно аннотируются этой аннотацией, поскольку те, которые, например, отмечены @SpringBootApplication (обычно) нет.

Теперь я ищу какой-то общий способ получения значения аннотации, даже если он добавляется только как кусок другой аннотации. Как я могу это сделать?

1
derM 27 Май 2019 в 16:29

2 ответа

Лучший ответ

Оказывается, есть набор утилит AnnotatedElementUtils, который позволяет вам обрабатывать эти объединенные аннотации .

for (Object annotated : context.getBeansWithAnnotation(ComponentScan.class).values()) {
    Class clazz = ClassUtils.getUserClass(annotated) // thank you jin!
    ComponentScan mergedAnnotation = AnnotatedElementUtils.getMergedAnnotation(clazz, ComponentScan.class);
    if (mergedAnnotation != null) { // For some reasons, this might still be null.
        // TODO: useful stuff.
    }
}
1
derM 28 Май 2019 в 09:29

Это может быть CglibProxy. поэтому вы не можете напрямую получить аннотацию.

ClassUtils.isCglibProxyClass(o)

Подробнее см. этот


Редактировать, вы можете добавить свой логический код. найти компонентное сканирование.

if (ClassUtils.isCglibProxyClass(o.getClass())) {
            Annotation[] annotations = ClassUtils.getUserClass(o).getAnnotations();
            for (Annotation annotation : annotations) {
                ComponentScan annotation1 = annotation.annotationType().getAnnotation(ComponentScan.class);
// in my test code , ComponentScan can get here.for @SpringBootApplication 
                System.out.println(annotation1);
            }

        }
1
jin 27 Май 2019 в 16:16