当前位置: 首页 > news >正文

AOP的妙用

一、改代码

自定义注解用于提示该代码已经在AOP中重构了

public @interface ReviseToAop {// 用于记录修改状态String value() default "";
}

使用注解(无意义,只是表名被修改)

   @ReviseToAop("修改于:2023/7/30")@GetMapping("/nm/{id}")public String Nm(@PathVariable("id") Integer id,@PathParam("name") String name) throws InterruptedException {log.info("当前未被修改的方法-------");return "当前未被修改的方法 id:"+id;}

aop中重构代码

监控类上的注解用@within(注解包地址)

监控方法上的注解用@annotation(注解地址)

监控方法用execution(权限类型 返回值类型 方法地址(参数类型))

    @Around("@annotation(com.example.demo.demos.contorl.ReviseToAop) && execution(String com.example.demo.demos.contorl.Hello.Nm(Integer,String))")public Object ReviseNm(ProceedingJoinPoint joinPoint) throws Throwable {Object[] args = joinPoint.getArgs();log.info("数据被修改----");return   "已经被修改: "+args[0]+"name:"+args[1];}

二、自定义注解

设置一个类似@Value注解实现基本类型的数据注入

自定义注解

@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyValue {String value() default "";
}

@MyValue需要在@RestController下才能生效

    @Around("@within(org.springframework.web.bind.annotation.RestController)")public  Object setValue(ProceedingJoinPoint joinPoint) throws Throwable {Object target = joinPoint.getTarget();Field[] declaredFields = target.getClass().getDeclaredFields();for(Field field:declaredFields){field.setAccessible(true);MyValue annotation = field.getAnnotation(MyValue.class);if(!Objects.isNull(annotation)) {field.set(target, annotation.value());log.info("当前对象:{},当前字段:{},当前类名赋值:{}", joinPoint.getTarget().getClass().getName(), field.getName(),annotation.value());}}return   joinPoint.proceed(joinPoint.getArgs());}
ProceedingJoinPoint 对象
JoinPoint.getTarget() 获得当前对象joinPoint.getArgs() 获得当前参数
joinPoint.getTarget().getClass() 获得当前对象类的反射

http://www.lryc.cn/news/101599.html

相关文章:

  • CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法
  • 【大数据趋势】7月30日 汇率,恒指期货的大数据趋势概率分析。
  • mac使用mvn下载node-sass 会Binary download failed, trying source
  • 【C++】开源:Muduo网络库配置与使用
  • VCS ICO - Intelligent Coverage Optimization
  • 【分布式系统】分布式系统的8个谬误
  • tinkerCAD案例:25. 量角器 - 测量角度
  • Flutter 使用texture_rgba_renderer实现桌面端渲染视频
  • linux虚拟机开机后桌面显示CentOS-7.5-x86盘片文件,并且无法远程连接虚拟机?
  • 【Spring Boot 源码学习】走近 AutoConfigurationImportSelector
  • 系统学习Linux-MySQL数据库备份(四)
  • 具身智能controller---RT-1(Robotics Transformer)(中---实验介绍)
  • 无涯教程-jQuery - load( url, data, callback)方法函数
  • 【Shell】Shell编程之免交互
  • 从Vue2到Vue3【七】——Vue2中响应式原理的实现及其缺陷
  • 用C语言实现堆排序算法
  • tauri在github上进行自动更新打包并发版过程,实战操作避坑
  • css中flex后文本溢出的问题
  • restful接口设计规范[仅供参考]
  • Metabase 远程代码执行(CVE-2023-38646)
  • 【TiDB理论知识 07】SQL执行流程
  • 微服务——服务异步通讯RabbitMQ
  • 事件冒泡、事件捕获和事件委托
  • WEB 典型安全功能说明
  • SQL编译优化原理
  • qt signal slots lambda
  • Spring【声明式事务】
  • 【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚2
  • pytorch 中 view 和reshape的区别
  • 认识数组指针