关于aop切面 注解、参数如何获取
更新时间:2022年01月11日 09:38:53 作者:筏镜
这篇文章主要介绍了关于aop切面 注解、参数如何获取,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
aop切面 注解、参数如何获取
在工作中会经常使用aop,这里将aop使用基本方法,获取在切点中使用的获取参数、注解做一个样例。
定义需要切面的注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AnnDemo { String value(); boolean isAop() default true; }
在需要进行切面的方法标注注解
@RestController @RequestMapping("/order") public class OrderController { @Autowired private OrderService orderService; @RequestMapping("/all") @AnnDemo(value = "all",isAop = false) public List<TbOrder> findAll() { List<TbOrder> list = orderService.getOrderList(); return list; } @RequestMapping("/page") @AnnDemo(value = "page") public List<TbOrder> findPage(@RequestParam("username") String username) { List<TbOrder> listPage = orderService.getOrdersListPage(); return listPage; } }
定义切面
在切面中获取切点注解,方法,参数的获取
@Aspect @Component public class AspectDemo { @Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..))") public void excetionMethod() {} @Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)") public void excetionNote() { } @Before("excetionMethod()") public void testBefore(JoinPoint joinPoint) { System.out.println("----------------------------前置通知---"); Object[] args = joinPoint.getArgs(); for (Object arg : args) { System.out.println(arg); } } @Around(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)") public Object testBeforeNote(ProceedingJoinPoint joinPoint) throws Throwable { //用的最多通知的签名 Signature signature = joinPoint.getSignature(); MethodSignature msg=(MethodSignature) signature; Object target = joinPoint.getTarget(); //获取注解标注的方法 Method method = target.getClass().getMethod(msg.getName(), msg.getParameterTypes()); //通过方法获取注解 AnnDemo annotation = method.getAnnotation(AnnDemo.class); Object proceed; //获取参数 Object[] args = joinPoint.getArgs(); System.out.println(annotation.value()); System.out.println(annotation.isAop()); for (Object arg : args) { System.out.println(arg); } if (Objects.isNull(annotation) || !annotation.isAop()) { System.out.println("无需处理"); proceed = joinPoint.proceed(); }else { System.out.println("进入aop判断"); proceed = joinPoint.proceed(); if(proceed instanceof List){ List proceedLst = (List) proceed; if(!CollectionUtils.isEmpty(proceedLst)){ TbOrder tbOrder = new TbOrder(); tbOrder.setPaymentType("fffffffffffffffffff"); ArrayList<TbOrder> tbOrderLst = new ArrayList<>(); tbOrderLst.add(tbOrder); return tbOrderLst; } } System.out.println(proceed); } return proceed; } }
aop中获取自定义注解的属性值
自定义注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface SystemLog { public String description() default ""; }
用在方法上
@ResponseBody @ValidRequestBody @RequestMapping("/login") @SystemLog(description="登录") public GlobalResponse login(@RequestBody @Valid User user, BindingResult bindingResult){ ...... }
获取注解的属性值
@Around("@annotation(com.xxx.xxx.xxx.SystemLog)") public Object around(ProceedingJoinPoint joinPoint) throws Throwable{ SystemLog systemLog = ((MethodSignature)joinPoint.getSignature()).getMethod().getAnnotation(SystemLog.class); ...... }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot基于RabbitMQ实现消息可靠性的方法
RabbitMQ 提供了 publisher confirm 机制来避免消息发送到 MQ 过程中丢失,这种机制必须给每个消息指定一个唯一ID,消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功,本文给大家介绍了SpringBoot基于RabbitMQ实现消息可靠性的方法,需要的朋友可以参考下2024-04-04详解Spring Security 捕获 filter 层面异常返回我们自定义的内容
Spring 的异常会转发到 BasicErrorController 中进行异常写入,然后才会返回客户端。所以,我们可以在 BasicErrorController 对 filter异常进行捕获并处理,下面通过本文给大家介绍Spring Security 捕获 filter 层面异常,返回我们自定义的内容,感兴趣的朋友一起看看吧2022-05-05Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
本文主要介绍Tomcat启动分析的知识,这里整理了相关资料及分析原因和如何实现的方法,有兴趣的小伙伴可以参考下2016-09-09IDEA “Cannot resolve symbol”爆红问题解决
最近发现个问题,IDEA 无法识别同一个 package 里的其他类,将其显示为红色,本文就来介绍一下IDEA “Cannot resolve symbol”爆红问题解决,感兴趣的可以了解一下2023-10-10spring boot实现图片上传到后台的功能(浏览器可直接访问)
这篇文章主要介绍了spring boot实现图片上传到后台的功能(浏览器可直接访问),需要的朋友可以参考下2022-04-04
最新评论