С помощью 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
(обычно) нет.
Теперь я ищу какой-то общий способ получения значения аннотации, даже если он добавляется только как кусок другой аннотации. Как я могу это сделать?
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.
}
}
Это может быть 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);
}
}
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].