从 Spring 中的 'composed Annotations' 获取值
Get values from 'composed Annotations' in Spring
使用Spring,您可以拥有某种组合注释。一个突出的例子是 @SpringBootApplication
-注释,它是 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
.
的组合
我正在尝试获取受某个注释影响的所有 Bean,即 ComponentScan
。
根据 this 的回答,我正在使用以下代码:
for (T o : applicationContext.getBeansWithAnnotation(ComponentScan.class).values()) {
ComponentScan ann = (ComponentScan) o.getClass().getAnnotation(ComponentScan.class);
...
}
这是行不通的,因为并非所有由 getBeansWithAnnotation(ComponentScan.class)
返回的 bean 确实都用该注释进行了注释,因为那些是例如用 @SpringBootApplication
注释的(通常)不是。
现在我正在寻找某种通用方法来检索注释的值,即使它仅作为另一个注释的 piece 添加。
我该怎么做?
可能是CglibProxy。所以不能直接获取Annotation。
ClassUtils.isCglibProxyClass(o)
有关更多信息,请参阅
编辑,你可以添加你的逻辑代码。找到 ComponentScan。
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);
}
}
事实证明,有一个实用程序集 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.
}
}
使用Spring,您可以拥有某种组合注释。一个突出的例子是 @SpringBootApplication
-注释,它是 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
.
我正在尝试获取受某个注释影响的所有 Bean,即 ComponentScan
。
根据 this 的回答,我正在使用以下代码:
for (T o : applicationContext.getBeansWithAnnotation(ComponentScan.class).values()) {
ComponentScan ann = (ComponentScan) o.getClass().getAnnotation(ComponentScan.class);
...
}
这是行不通的,因为并非所有由 getBeansWithAnnotation(ComponentScan.class)
返回的 bean 确实都用该注释进行了注释,因为那些是例如用 @SpringBootApplication
注释的(通常)不是。
现在我正在寻找某种通用方法来检索注释的值,即使它仅作为另一个注释的 piece 添加。 我该怎么做?
可能是CglibProxy。所以不能直接获取Annotation。
ClassUtils.isCglibProxyClass(o)
有关更多信息,请参阅
编辑,你可以添加你的逻辑代码。找到 ComponentScan。
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);
}
}
事实证明,有一个实用程序集 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.
}
}