为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2022-12-15 16:34:27
使用 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的(通常)不是。现在我正在寻找某种通用的方法来检索注释的值,即使它只是作为另一个注释的一部分添加。我怎样才能做到这一点?
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

事实证明,有一个实用程序集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.

    }

}


查看完整回答
反对 回复 2022-12-15
?
jeck猫

TA贡献1909条经验 获得超7个赞

它可能是 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);

            }


        }


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信