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

Spring AOP - 自定义注解实现共性需求

在pom文件中引入依赖

 <!--Spring切面类底层的依赖-->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version>
</dependency>

构建自定义注解

//注解的作用目标,表示该注解用在方法上
@Target(ElementType.METHOD)
//注解的保留时间,表示注解在运行时保留
@Retention(RetentionPolicy.RUNTIME)
//@interface:用来说明是个注解类
public @interface MethodExporter {
}

切面类

//说明当前对象是个切面
@Aspect
//将当前对象交给Spring IOC实例化并管理
@Component
//用于打印日志
@Slf4j
public class MethodExporterAspect {//@Around环绕通知,最强大的通知类型,可以控制方法入参、执行、返回结果等各方面细节//里面的表达式@annotation用来说明某个方法上书写了MethodExporter注解的话就会执行下面的方法//对目标方法进行增强@Around("@annotation(com.meteorological.aop.MethodExporter)")public Object methodExporter(ProceedingJoinPoint joinPoint) throws Throwable{long st = System.currentTimeMillis();//joinPoint:连接点;执行目标方法,获取返回值; proceed:继续进行Object proceed = joinPoint.proceed();long et = System.currentTimeMillis();ObjectMapper mapper = new ObjectMapper();//将入参JSON序列化String jsonParam = mapper.writeValueAsString(joinPoint.getArgs());//将返回结果JSON序列化String jsonResult = null;if (proceed!=null){jsonResult = mapper.writeValueAsString(proceed);}else {jsonResult = "null";}//模拟上报过程log.info("正在上报服务器调用过程:\ntarget:{}.{}()\nexecution:{}ms,\nparameter:{}\nresult:{} ",joinPoint.getTarget().getClass().getSimpleName(),joinPoint.getSignature().getName(),(et-st),jsonParam,jsonResult);return proceed;}
}

测试自定义注解

@RestController
@RequestMapping(value = "/aopTest")
public class TestController {@MethodExporter@RequestMapping(value = "/insert")public Result<Object> insert( String str) {return Result.success("insert " + str);}
}

输出结果,成功使用AOP+自定义注解的方式增强方法

target:TestController.insert()
execution:4ms,
parameter:["str123"]
result:{"code":0,"msg":"success","data":"insert str123"} 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】开源:地图投影和坐标转换proj库配置使用
  • qt 自定义信号和槽举例
  • Spring的AOP进阶。(AOP的通知类型、通知顺序、切入点表达式和连接点。)
  • 数据绑定注解功能
  • @component注解的分类
  • 【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现
  • uni-app三部曲之三: 路由拦截
  • 【系统架构设计】计算机组成与体系结构(一)
  • alibaba EasyExcel 简单导出数据到Excel
  • 创建vue3项目
  • 侯捷C++面向对象高级编程(上)-9-扩展补充:类模板、函数模板及其他
  • 哪些独立站外链策略最有效?
  • 压测jmeter 插件 之 tps和响应时间图
  • mysql 一主多从环境搭建
  • (C++哈希表01)
  • 自己简单写的 事件订阅机制
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • PAT A1092
  • python_bomb----数据类型总结
  • rabbitmq延迟消息示例
  • select2 取值 遍历 设置默认值
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 翻译:Hystrix - How To Use
  • 缓存与缓冲
  • 简单易用的leetcode开发测试工具(npm)
  • 目录与文件属性:编写ls
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何利用MongoDB打造TOP榜小程序
  • 微信开放平台全网发布【失败】的几点排查方法
  • 正则表达式
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​学习一下,什么是预包装食品?​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # wps必须要登录激活才能使用吗?
  • #QT(TCP网络编程-服务端)
  • #QT(串口助手-界面)
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八)c52学习之旅-中断实验
  • (二十四)Flask之flask-session组件
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四)JPA - JQPL 实现增删改查
  • (五)c52学习之旅-静态数码管
  • ... 是什么 ?... 有什么用处?
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net反编译工具
  • .NET是什么
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @RunWith注解作用