如何通过Aspect切面获取自定义注解的参数值?
实现方案
共有两种常用方式可以拿到自定义注解的属性值:
方式一:注解直接绑定到切面方法参数(推荐,代码更简洁)
修改切面类代码如下,Spring会自动将匹配的注解实例注入到切面方法的参数中,直接读取属性即可:
@Aspect @Component @EnableAspectJAutoProxy public class CronLoggerAspect { private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class); // 注意@annotation括号中写的是方法参数的变量名,要和下方参数名保持一致 @Around("@annotation(cronLogger)") public Object trace(ProceedingJoinPoint joinPoint, CronLogger cronLogger) throws Throwable { // 直接读取注解的name属性 String cronName = cronLogger.name(); log.info("CronLogger注解name值:{}", cronName); // 原有获取入参的逻辑可以保留 Object[] tab = joinPoint.getArgs(); for (Object object : tab) { log.debug("CronLogger入参: {}", object); } return joinPoint.proceed(); } }
方式二:通过方法签名反射获取注解
如果不需要绑定参数,也可以从切点对象中拿到当前执行的方法,再反射读取注解:
@Aspect @Component @EnableAspectJAutoProxy public class CronLoggerAspect { private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class); @Around("@annotation(CronLogger)") public Object trace(ProceedingJoinPoint joinPoint) throws Throwable { // 从切点获取方法签名,再拿到当前执行的方法对象 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); // 读取方法上的自定义注解 CronLogger cronLogger = method.getAnnotation(CronLogger.class); String cronName = cronLogger.name(); log.info("CronLogger注解name值:{}", cronName); // 原有获取入参的逻辑可以保留 Object[] tab = joinPoint.getArgs(); for (Object object : tab) { log.debug("CronLogger入参: {}", object); } return joinPoint.proceed(); } }
两种方式最终都可以拿到你配置的unit test值,控制台会输出对应日志。你已经给CronLogger配置了RUNTIME保留策略,不需要额外修改注解代码。
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

