Получите значения из «составленных аннотаций» весной - PullRequest
1 голос
/ 27 мая 2019

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Оказывается, есть набор утилит 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 голос
/ 27 мая 2019

это может быть 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);
            }

        }
...