从 Spring 的“组合注释”中获取值

使用 Spring,您可以拥有某种组合注释。一个突出的例子是@SpringBootApplication-annotation,它是 @Configuration,@EnableAutoConfiguration和的组合@ComponentScan

我正在尝试获取受某个注释影响的所有 Bean,即ComponentScan.

按照这个答案,我正在使用以下代码:

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

这是行不通的,因为并非所有返回的 beangetBeansWithAnnotation(ComponentScan.class)都确实用该注释进行了注释,因为那些被注释@SpringBootApplication的(通常)不是。

现在我正在寻找某种通用的方法来检索注释的值,即使它只是作为另一个注释的一部分添加。我怎样才能做到这一点?


慕码人8056858
浏览 68回答 2
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.    }}

jeck猫

它可能是 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);            }        }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java