Spring AOP用法 📅 发布时间:2026/7/15 16:38:23 👁️ 浏览次数: 1、导入依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency2、针对于特定方法根据业务需要进行编程Component Aspect //当前类为切面类 Slf4j public class RecordTimeAspect { Around(execution(* com.itheima.service.impl.DeptServiceImpl.*(..))) public Object recordTime(ProceedingJoinPoint pjp) throws Throwable { //记录方法执行开始时间 long begin System.currentTimeMillis(); //执行原始方法 Object result pjp.proceed(); //记录方法执行结束时间 long end System.currentTimeMillis(); //计算方法执行耗时 log.info(方法执行耗时: {}毫秒,end-begin); return result; } }Aspect标记这是切面定义切面类Component交给 Spring 容器管理3、切面表达式//返回类型和包名中间有个空格execution(修饰符? 返回类型 包名.类名.方法名(参数) throws 异常?)例1:带有修饰符的execution(public * com.sky.service.*.*(..))例2限定参数类型execution(* com.sky.service.*.add(java.lang.Long,java.lang.String))例3带异常声明execution(* com.sky.service.*.*(..) throws java.io.IOException)例4拦截注解execution(* com.sky.mapper..*.*(..)) annotation(com.sky.annotation.AutoFill)4、常用注解Pointcut定义切入点拦截到符合切面表达式的方法后执行autoFillPointCut方法Pointcut(execution(* com.sky.mapper.admin.*.*(..)) annotation(com.sky.annotation.AutoFill)) public void autoFillPointCut(){ }Before:在拦截的方法前执行AOP的特定方法Before(autoFillPointCut()) public void autoFill(JoinPoint joinPoint){ log.info(开始进行公共字段自动填充...); //获取到当前被拦截的方法上的数据库操作 MethodSignature signature (MethodSignature) joinPoint.getSignature(); //得到注解的实例 AutoFill annotation signature.getMethod().getAnnotation(AutoFill.class); OperationType value annotation.value(); //获得到当前被拦截的方法的参数——实体对象 Object[] args joinPoint.getArgs(); if(argsnull||args.length0){ return; } Object objectsargs[0]; //准备赋值的数据 //创建时间 LocalDateTime nowLocalDateTime.now(); //创建人 Long currentId BaseContext.getCurrentId(); //根据当前不同的操作类型为对应的属性通过反射来赋值 if(value.equals(OperationType.INSERT)){ //为四个公共字段赋值 try { Method setCreateTime objects.getClass().getDeclaredMethod(setCreateTime, LocalDateTime.class); Method setCreateUser objects.getClass().getDeclaredMethod(setCreateUser, Long.class); Method setUpdateTime objects.getClass().getDeclaredMethod(setUpdateTime, LocalDateTime.class); Method setUpdateUser objects.getClass().getDeclaredMethod(setUpdateUser, Long.class); //通过反射为对象属性赋值 setCreateTime.invoke(objects,now); setCreateUser.invoke(objects,currentId); setUpdateTime.invoke(objects,now); setUpdateUser.invoke(objects,currentId); } catch (Exception e) { e.printStackTrace(); } }else if(value.equals(OperationType.UPDATE)){ //更新这两个字段 Method setUpdateTime null; try { setUpdateTime objects.getClass().getDeclaredMethod(setUpdateTime, LocalTime.class); Method setUpdateUser objects.getClass().getDeclaredMethod(setUpdateUser, Long.class); setUpdateTime.invoke(objects,now); setUpdateUser.invoke(objects,currentId); } catch (Exception e) { e.printStackTrace(); } } }After:在拦截的方法执行后执行AOP的特定方法// 后置通知不管方法成功还是报错都清空ThreadLocal After(pointCut()) public void afterClearThreadLocal(){ // 清理线程本地变量防止线程池复用导致数据错乱 BaseContext.removeCurrentId(); log.info(【After】执行完毕清空ThreadLocal登录信息); }AfterReturning成功才要做记录成功日志、处理返回值、更新缓存// returning result 必须和定义的切面方法参数名一致 AfterReturning(value servicePointcut(), returning result) public void afterReturning(JoinPoint joinPoint, Object result){ // 获取方法名 String methodName joinPoint.getSignature().getName(); log.info(【正常执行完毕】方法{}返回结果{}, methodName, result); // 场景新增用户成功后记录操作日志 // 场景拿到返回值统一包装、脱敏 }Around环绕通知此注解标注的通知方法在目标方法前、后都被执行//环绕通知 Around(execution(* com.itheima.service.*.*(..))) public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { log.info(around before ...); //调用目标对象的原始方法执行 Object result proceedingJoinPoint.proceed(); //原始方法如果执行时有异常环绕通知中的后置代码不会在执行了 log.info(around after ...); return result; }
AI客户端选型指南:从开源工具到本地部署的完整实践 1. 项目概述:一个AI客户端的“Awesome”清单如果你最近在折腾各种AI应用,特别是那些需要自己部署、对接不同大模型API的客户端工具,那你大概率和我一样,经历过一段“选择困难症”时期。市面上工具层出不穷,有开源的、闭… 2026/5/5 10:44:13
10分钟搞定:小爱音箱语音音乐播放终极指南 10分钟搞定:小爱音箱语音音乐播放终极指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 想让你的小爱音箱播放任何你想听的歌曲吗?无论是本… 2026/5/5 10:43:42
开源链上数据分析框架Gotham Insights:从数据获取到Alpha策略实战 1. 项目概述:链上数据分析的“哥谭”视角如果你在Web3或者加密货币领域待过一段时间,肯定会经常听到“链上数据”这个词。它听起来很酷,仿佛掌握了它就能预知市场涨跌,看透大户动向。但现实是,面对以太坊、Solana这些公… 2026/5/17 3:05:14
GeoServer开源地理空间服务器:从开发到部署的完整实战指南 GeoServer开源地理空间服务器:从开发到部署的完整实战指南 【免费下载链接】geoserver Official GeoServer repository 项目地址: https://gitcode.com/gh_mirrors/ge/geoserver GeoServer作为业界领先的开源地理空间数据服务器,为Web地图服务提供… 2026/7/15 16:36:32
GriddyCode:终极自定义代码编辑器的完整实现指南 GriddyCode:终极自定义代码编辑器的完整实现指南 【免费下载链接】griddycode A code editor made with Godot. Code has never been more lit! 项目地址: https://gitcode.com/GitHub_Trending/gr/griddycode GriddyCode是一款基于Godot引擎构建的高度可定制… 2026/7/15 16:34:31
Windows Home Server 2011安装实测:兼容性、文件共享与备份功能验证 这类老版本服务器系统的安装测试,最值得关注的不是功能有多新,而是能不能在现在的硬件上顺利跑起来,以及还能不能满足基本的文件共享和备份需求。Windows Home Server 2011 作为微软最后一版专门为家庭环境设计的服务器系统,虽然官… 2026/7/15 16:34:31
单片机----汇编语言入门知识点 1. 汇编语言与单片机的关系 当你第一次接触单片机编程时,可能会被各种高级语言(如C、Python)所吸引。但真正要深入理解硬件的工作原理,汇编语言是绕不开的一道坎。我在刚学习单片机时,也曾对汇编感到头疼——那些看似晦… 2026/7/15 16:30:30
vLLM 与 SGLang 推理框架性能横评:吞吐、延迟与成本深度解析 一、 引言:大模型推理框架的演进与挑战 随着大语言模型(LLM)应用从探索走向规模化部署,推理框架的性能、效率和成本已成为技术选型的核心考量。vLLM 凭借其创新的 PagedAttention 技术,在吞吐量优化上树立了标杆&… 2026/7/15 16:28:30
如何利用Akagi麻将AI助手实现雀魂智能分析:终极实战指南 如何利用Akagi麻将AI助手实现雀魂智能分析:终极实战指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Ama… 2026/7/15 16:26:29
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41