七叶笔记 » java编程 » Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法

Spring 代理 Bean 获取不到原始 Bean 对象注解解决方法

一、问题描述

在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。 所以我需要对 consumer 对象进行代理,然后如果超过异常次数,我直接返回成功,并且发送成功消息,但是我获取 consumer handler 方法的方式是通过 method.getAnnotation(XXClient.class) 方式,那么就会返回 null。

1.问题示例代码 目标类, 我这里就之定义一个 test 方法,里面做一些个简单的打印。 代理逻辑逻辑处理, 主要就是做一个 @Around 的方法覆盖,保证在调用目标方法之前,先输出我插入的逻辑。 调用点, 通过 AnnotationConfigApplicationContext 获取 bean. 然后通过 getMethods() 获取所有的方法,最后查找 Anno 注解的 Method 对象。

由于 m.getAnnotaion(Anno.class) 无法获取到注解信息,所以执行 test 方法失败, 到此问题还原完毕,我们再来看看如何解决。

二、解决方案

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

有的代码是这样写的 :

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

总结:

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

相关文章