从 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.
    }
}