Spring代理对象导致的获取不到原生对象注解的解决

 更新时间:2022年04月02日 09:48:37   作者:心城以北  
本文主要介绍了Spring代理对象导致的获取不到原生对象注解的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

我在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。

所以我需要对 consumer 对象进行代理,然后如果超过异常次数,我直接返回成功,并且发送成功消息,但是我获取 consumer handler 方法的方式是通过 method.getAnnotation(XXClient.class) 方式,那么就会返回 null。

问题示例代码

目标类, 我这里就之定义一个 test 方法,里面做一些个简单的打印。

@Component
public class TestBean {

    @Anno
    public void test() {
        System.out.println("test .....");
    }
}

代理逻辑逻辑处理, 主要就是做一个 @Around 的方法覆盖,保证在调用目标方法之前,先输出我插入的逻辑。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {

    String key() default "100%";
}

@Aspect
@Component
public class AnnoAspect {

    @Around("@annotation(anno)")
    public Object anno(ProceedingJoinPoint point, Anno anno) throws Throwable {
        System.out.println("anno invoke!!!!!!");
        return point.proceed();
    }


}

调用点, 通过 AnnotationConfigApplicationContext 获取 bean. 然后通过 getMethods() 获取所有的方法,最后查找 Anno 注解的 Method 对象。

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanStart.class);
    TestBean bean = applicationContext.getBean(TestBean.class);

    Class<? extends TestBean> classz = bean.getClass();
    Method[] methods = classz.getMethods();

    for (Method m : methods) {
        Anno annotation = m.getAnnotation(Anno.class);

        if (annotation != null) {
            System.out.println(" ============= invoke test ===========");
            m.invoke(bean, new Object());
        }
    }    

由于 m.getAnnotaion(Anno.class) 无法获取到注解信息,所以执行 test 方法失败,

到此问题还原完毕,我们再来看看如何解决。

解决方案

通过 Anno ao = AnnotationUtils.findAnnotation(classz, Anno.class); 方法获取即可。

有的代码是这样写的 :

String name = classz.getName();
boolean isSpringProxy = name.indexOf("SpringCGLIB$$") >= 0;
Method[] methods;
if (isSpringProxy) {
    methods = ReflectionUtils.getAllDeclaredMethods(AopUtils.getTargetClass(bean));
} else {
    methods = classz.getMethods();
}

// 省略部分代码
if (isSpringProxy) {
    annotation = AnnotationUtils.findAnnotation(method, MqClient.class);
} else {
    annotation = method.getAnnotation(Anno.class);
}

这里他会做一个判断,如果是代理对象就调用  ReflectionUtils.getAllDeclaredMethods 获取所有的方法, 然后再去拿注解的时候二次判断一下,如果存在代理,那么就通过 AnnotationUtils.findAnnotation 感觉是相当的严谨。

总结

Spring 提供了非常强大的一站式开发功能,而且还提供了比较优秀的工具方法比如: BeanUtils 、ReflectionUtils 、AnnotationUtils 等,这些都是我们值得掌握的基础工具类。

参考资料

https://www.jianshu.com/p/b69e64121b97

到此这篇关于Spring代理对象导致的获取不到原生对象注解的解决的文章就介绍到这了,更多相关Spring获取不到原生对象注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java并发编程总结——慎用CAS详解

    Java并发编程总结——慎用CAS详解

    下面小编就为大家带来一篇Java并发编程总结——慎用CAS详解。小编觉得挺不错的, 现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 详解java实现简单扫码登录功能(模仿微信网页版扫码)

    详解java实现简单扫码登录功能(模仿微信网页版扫码)

    这篇文章主要介绍了java实现简单扫码登录功能(模仿微信网页版扫码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Idea中springboot项目的热部署无法生效问题解决

    Idea中springboot项目的热部署无法生效问题解决

    本文主要介绍了Idea中springboot项目的热部署无法生效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • Java实现滑动窗口算法的示例代码

    Java实现滑动窗口算法的示例代码

    滑动窗口算法是一种高效解决子数组、子字符串问题的算法,广泛应用于数据流处理、网络限流和字符串操作等场景,本文将详细解析滑动窗口算法的核心思想、常见问题及其实现方式,需要的朋友可以参考下
    2025-03-03
  • Spring的@Value注入复杂类型(通过@value注入自定义类型)

    Spring的@Value注入复杂类型(通过@value注入自定义类型)

    Spring的@Value可以注入复杂类型吗?今天教你通过@value注入自定义类型。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • springboot 整合fluent mybatis的过程,看这篇够了

    springboot 整合fluent mybatis的过程,看这篇够了

    这篇文章主要介绍了springboot 整合fluent mybatis的过程,配置数据库连接创建数据库的详细代码,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • java hashtable实现代码

    java hashtable实现代码

    这篇文章介绍了java hashtable实现代码,有需要的朋友可以参考一下
    2013-10-10
  • Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题

    Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题

    这篇文章主要介绍了Java EasyExcel读写excel如何解决poi读取大文件内存溢出问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java基于HttpClient实现RPC的示例

    Java基于HttpClient实现RPC的示例

    HttpClient可以实现使用Java代码完成标准HTTP请求及响应。本文主要介绍了Java基于HttpClient实现RPC,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • ZooKeeper官方文档之Java案例解读

    ZooKeeper官方文档之Java案例解读

    ZooKeeper官方提供了一个Java监听的例子,本文是我对该例子的学习笔记。可以做为帮助理解此例子的资料,有需要的朋友可以借鉴参考下
    2022-01-01

最新评论