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

Spring学习04-[Spring容器核心技术AOP学习]

AOP学习

  • AOP介绍
  • 使用
    • 对业务方法添加计算时间的增强
  • @EnableAspectJAutoProxy
  • AOP的术语
  • 通知
    • 前置通知@Before
    • 后置通知@After
    • 返回通知@AfterReturning
    • 异常通知@AfterThrowing
    • 总结-通知执行顺序
  • 切点表达式的提取-使用@Pointcut进行抽取
  • 切点表达式的详细用法
    • execution和@annotation组合
  • SpringAOP和注解的使用-配置全局日志

AOP介绍

在这里插入图片描述
在这里插入图片描述

  • 如何在Spring中创建一个所谓切面?
    @Aspect+@Component+通知+切点
  • 切面里面的代码怎么运行在业务方法(之前、之后)?
    通知+切点

使用

实现一个对service方法的增强,添加日志

  • 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

在这里插入图片描述

对业务方法添加计算时间的增强

  • 业务类
@Service
public class UserService {public void add(){System.out.println("增加");}public void delete(){System.out.println("删除");}public void update(){System.out.println("修改");}public void query(){System.out.println("查询");}
}
  • 切面类
    啥叫面向切面编程:面向切面编程就是面向切面类进行编程
@Aspect //标记为切面类
@Component
public class LogAspect {//实现方法用时 切点表达式@Around("execution(* com.sping.service.UserService.*(..))")public Object log(ProceedingJoinPoint joinPoint) throws Throwable {//记录方法用时long startTime = System.currentTimeMillis();//执行具体的方法try {joinPoint.proceed(); //连接点就是具体的方法}catch (Exception e){System.out.println("方法执行异常");throw new Exception();}long endTime = System.currentTimeMillis();System.out.println("方法用时:" + (endTime - startTime) + "ms");return null;}}
  • 测试
  @Autowiredprivate UserService userService;@Testpublic void test() throws InterruptedException {userService.add();}

在这里插入图片描述

@EnableAspectJAutoProxy

在这里插入图片描述
在这里插入图片描述

AOP的术语

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
切面、切点、通知、连接点;顾问(通知+切点)
在这里插入图片描述

通知

  • 前置通知
  • 后置通知
  • 返回通知
  • 异常通知
    在定义切点的时候,可以把切点定义到另一个方法中,然后在通知中引入即可
@Aspect
@Component
public class LogAspect{@Pointcut("execution( * com.sping.service.UserService.*(..))")public void PointCut(){}@AfterReturning("PointCut()")public void log(){System.out.println("后置通知执行");}
}

环绕通知和其他通知的区别:环绕通知需要手动去拿到连接点执行目标方法,环绕方法更加的灵活

前置通知@Before

在目标方法执行之前执行

@Aspect
@Component
public class LogAspect{@Before("execution(* com.sping.service.*.*(..))")public void log(){System.out.println("前置通知执行");}
}

可以看到标注了前置通知后,前置通知的增强方法先执行,然后再执行目标方法
在这里插入图片描述

后置通知@After

与前置通知相反,后置通知是目标方法执行之后才会执行,通知里的增强方法

@Aspect
@Component
public class LogAspect{@After("execution(* com.sping.service.*.*(..))")public void log(){System.out.println("后置通知执行");}
}

在这里插入图片描述

返回通知@AfterReturning

执行位置:在方法执行完,返回值返回之前执行

    @Pointcut("execution( * com.sping.service.UserService.*(..))")public void PointCut(){}/*** 返回通知* 1、可以获取返回值* 2、在后置通知之前执行* 3、方法执行返回值需要手动声明*/@AfterReturning(value = "PointCut()",returning = "returnValue")public void log(){System.out.println("返回通知执行,返回值:" + returnValue);}

在这里插入图片描述

异常通知@AfterThrowing

   /*** 发生了异常后会执行*/@AfterThrowing(value = "PointCut()",throwing = "exception")public void log(Exception exception){System.out.println("异常通知执行" + exception.getMessage());}

在这里插入图片描述

总结-通知执行顺序

正常:前置通知---->目标方法---->返回通知---->后置通知(finallly)
异常:前置通知---->目标方法---->异常通知---->后置通知(finally)
在这里插入图片描述

切点表达式的提取-使用@Pointcut进行抽取

方便切点进行统一管理

  @Pointcut("execution( * com.sping.service.UserService.*(..))")public void PointCut(){}

切点表达式的详细用法

  • 切点标识符
  • execution:用于匹配方法执行连接点。这是使用SpringAOP时,使用的主要切点标识符,可以匹配到方法级别,细粒度
    在这里插入图片描述
  • @annotation:限制匹配连接点,在Spring AOP中执行的具有给定的注解(只有含有某些注解,才会生效)
    比如下面这段代码,只有我方法上加了@Log注解的才会被切到,进行增强
   @Pointcut("@annotation(com.sping.annotation.Log)")public void PointCut(){}

execution和@annotation组合

格式:@Pointcut(“execution()&&”+“@annotation()”)

  • 第一种方式:
     @Pointcut("execution(* com.sping.service.*.*(..))&&"+"@annotation(com.sping.annotation.Log)")public void PointCut() {}@Before(value = "PointCut()")public void log() {System.out.println("开始记录日志");}
  • 第二种方式:
    设置两个切点方法,再引入的时候通过&&符号进行引入
   @Pointcut("execution(* com.sping.service.*.*(..))")public void pointCutClass() {}@Pointcut("@annotation(com.sping.annotation.Log)")public void pointCutAnnotation(){}@Before(value = "pointCutClass()&&pointCutAnnotation()")public void log() {System.out.println("开始记录日志");}

SpringAOP和注解的使用-配置全局日志

  • 自定义注解
package com.test.aspect;import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {/*模块*/String title() default "";/*功能*/String action() default "";
}
  • 切面类
/*** @ClassName LogAspect* @Description* @Author 周志强* @Date 2021/5/12 12:27* @Version 1.0*/
@Aspect
@Component("logAspect")
public class LogAspect {private static Logger log= LoggerFactory.getLogger(LogAspect.class);//配置切入点@Pointcut("@annotation(com.test.aspect.Log)")public void logPointCut(){}//后置通知 用于拦截操作,在方法返回后执行@AfterReturning(pointcut = "logPointCut()")public void doBefore(JoinPoint joinPoint){handelLog(joinPoint,null);}//拦截异常操作,有异常时执行@AfterThrowing(value = "logPointCut()",throwing = "e")public void doAfter(JoinPoint joinPoint,Exception e){handelLog(joinPoint,e);}public void handelLog(JoinPoint joinpoint,Exception e){try {Log annotationLog = getAnnotationLog(joinPoint);if (annotationLog == null) {return;}String className = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();String action = annotationLog.action();String title = annotationLog.title();//打印日志,如有需要还可以存入数据库logger.info(">>>>>>>>>>>>>模块名称:{}",title);logger.info(">>>>>>>>>>>>>操作名称:{}",action);logger.info(">>>>>>>>>>>>>类名:{}",className);logger.info(">>>>>>>>>>>>>方法名:{}",methodName);}catch (Exception exception){logger.error("=前置通知异常=");logger.error("异常信息:{}",e.getMessage());e.printStackTrace();}}private static Log getAnnotationLog(JoinPoint joinPoint) throws Exception {Signature signature = joinPoint.getSignature();MethodSignature methodSignature= (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {return  method.getAnnotation(Log.class);}return null;}
}

相关文章:

Spring学习04-[Spring容器核心技术AOP学习]

AOP学习 AOP介绍使用对业务方法添加计算时间的增强 EnableAspectJAutoProxyAOP的术语通知前置通知Before后置通知After返回通知AfterReturning异常通知AfterThrowing总结-通知执行顺序 切点表达式的提取-使用Pointcut进行抽取切点表达式的详细用法execution和annotation组合 Sp…...

第5章-组合序列类型

#全部是重点知识&#xff0c;必须会。 了解序列和索引|的相关概念 掌握序列的相关操作 掌握列表的相关操作 掌握元组的相关操作 掌握字典的相关操作 掌握集合的相关操作1&#xff0c;序列和索引 1&#xff0c;序列是一个用于存储多个值的连续空间&#xff0c;每一个值都对应一…...

大话光学原理:2.最短时间原理、“魔法石”与彩虹

一、最短时间原理 1662年左右&#xff0c;费马在一张信纸的边角&#xff0c;用他那著名的潦草笔迹&#xff0c;随意地写下了一行字&#xff1a;“光在两点间选择的路&#xff0c;总是耗时最少的。”这句话&#xff0c;简单而深邃&#xff0c;像是一颗悄然种下的种子&#xff0c…...

spring tx @Transactional 详解 `Advisor`、`Target`、`ProxyFactory

在Spring中&#xff0c;Transactional注解的处理涉及到多个关键组件&#xff0c;包括Advisor、Target、ProxyFactory等。下面是详细的解析和代码示例&#xff0c;解释这些组件是如何协同工作的。 1. 关键组件介绍 1.1 Advisor Advisor是一个Spring AOP的概念&#xff0c;它包…...

`CyclicBarrier` 是 Java 中的一个同步辅助工具类,它允许一组线程相互等待,直到所有线程都达到了某个公共屏障点(barrier point)

CyclicBarrier 是 Java 中的一个同步辅助工具类&#xff0c;它允许一组线程相互等待&#xff0c;直到所有线程都达到了某个公共屏障点&#xff08;barrier point&#xff09;。当所有线程都到达屏障点时&#xff0c;它们可以继续执行后续操作。CyclicBarrier 的特点是可以重复使…...

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…...

Debezium报错处理系列之第114篇:No TableMapEventData has been found for table id:256.

Debezium报错处理系列之第114篇:Caused by: com.github.shyiko.mysql.binlog.event.deserialization.MissingTableMapEventException: No TableMapEventData has been found for table id:256. Usually that means that you have started reading binary log within the logic…...

开发者必看:MySQL主从复制与Laravel读写分离的完美搭配

介绍 主从同步配置的主要性不用多说&#xff0c;本文将详细介绍了如何在MySQL数据库中设置主从复制&#xff0c;以及如何在Laravel框架中实现数据库的读写分离。 通过一系列的步骤&#xff0c;包括修改MySQL配置、创建同步账户、获取二进制日志文件名和位置、导出主服务器数据…...

二战架构师,拿下

前言 已经许久更新文章了&#xff0c;并不是因为我懒了&#xff0c;而是在备考系统架构师考试。个人感觉还是比较幸运的&#xff0c;低分飘过。现阶段任务也算完成了&#xff0c;记录一下感受。 什么是软考 软考&#xff0c;全称“计算机技术与软件专业技术资格&#xff08…...

泛微开发修炼之旅--35关于基于页面扩展和自定义按钮实现与后端交互调用的方法

文章链接&#xff1a;35关于基于页面扩展和自定义按钮实现与后端交互调用的方法...

原创作品—数据可视化大屏

设计数据可视化大屏时&#xff0c;用户体验方面需注重以下几点&#xff1a;首先&#xff0c;确保大屏信息层次分明&#xff0c;主要数据突出显示&#xff0c;次要信息适当弱化&#xff0c;帮助用户快速捕捉关键信息。其次&#xff0c;设计应直观易懂&#xff0c;避免复杂难懂的…...

AdaBoost集成学习算法理论解读以及公式为什么这么设计?

本文致力于阐述AdaBoost基本步骤涉及的每一个公式和公式为什么这么设计。 AdaBoost集成学习算法基本上遵从Boosting集成学习思想&#xff0c;通过不断迭代更新训练样本集的样本权重分布获得一组性能互补的弱学习器&#xff0c;然后通过加权投票等方式将这些弱学习器集成起来得到…...

uniapp内置组件uni.navigateTo跳转后页面空白问题解决

文章目录 导文空白问题 导文 在h5上跳转正常 但是在小程序里面跳转有问题 无任何报错 页面跳转地址显示正确&#xff0c;但页面内容为空 空白问题 控制台&#xff1a; 问题解决&#xff1a; 方法1&#xff1a; 可能是没有注册的问题&#xff0c;把没注册的页面 注册一下。 方…...

使用树莓派进行python开发,控制电机的参考资料

网站连接&#xff1a;https://www.cnblogs.com/kevenduan?page1 1、简洁的过程步骤&#xff0c; 2、有代码示例&#xff0c; 3、有注意事项&#xff0c;...

protobuf的使用

protobuf&#xff1a;是一种数据格式&#xff0c;独立于平台&#xff0c;独立于语言&#xff0c;是一种二进制格式&#xff0c;可以存储更加复杂的数据结构&#xff0c;比如图&#xff0c;树&#xff0c;结构体&#xff0c;类 作用&#xff1a; 1.持久化&#xff1a;把数据存…...

笔记15:while语句编程练习

练习一&#xff1a; 编写程序&#xff0c;求 2^24^26^2...n^2? -直到累加和大于或等于 10000 为止&#xff0c;输出累加和 -输出累加式中的项数&#xff0c;以及最大的数 n #include<stdio.h> int main() {int sum 0;int i 1;int n 0;while(sum < 10000)//将sum…...

打开excel时弹出stdole32.tlb

问题描述 打开excel时弹出stdole32.tlb 如下图&#xff1a; 解决方法 打开 Microsoft Excel 并收到关于 stdole32.tlb 的错误提示时&#xff0c;通常意味着与 Excel 相关的某个组件或类型库可能已损坏或不兼容。 stdole32.tlb 是一个用于存储自动化对象定义的类型库&#x…...

349. 两个数组的交集

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 一、题目 …...

重庆交通大学数学与统计学院携手泰迪智能科技共建的“智能工作室”

2024年7月4日&#xff0c;重庆交通大学数学与统计学院与广东泰迪智能科技股份有限公司携手共建的“智能工作室”授牌仪式在南岸校区阳光会议室举行。此举标志着数统学院与广东泰迪公司校企合作新篇章的开启&#xff0c;也预示着学院在智能科技教育领域的深入探索和实践。 广东…...

Pandas在生物信息学中的应用详解

Pandas在生物信息学中的应用详解 引言 生物信息学作为一门将计算机科学和生物学相结合的跨学科领域&#xff0c;正随着高通量实验技术的飞速发展而日益重要。Pandas&#xff0c;作为Python中一个强大的数据处理库&#xff0c;为生物信息学研究提供了便捷高效的数据处理和分析…...

BFloat16指令集与矩阵乘法优化技术详解

1. BFloat16指令集概述BFloat16&#xff08;Brain Floating Point 16&#xff09;是Google Brain团队提出的一种16位浮点格式&#xff0c;专为深度学习应用优化。这种格式保留了与IEEE 754单精度浮点数&#xff08;FP32&#xff09;相同的8位指数位&#xff0c;但将尾数位从23位…...

泉州某卫浴GEO优化实战:四标融合+场景化方法论,从搜索不可见到AI优先引用

我们在服务制造业企业的过程中发现一个根本性变化&#xff1a;过去大家关心“怎么让用户搜到我”&#xff0c;现在AI直接生成答案&#xff0c;企业真正的挑战变成了“怎么让AI准确信任我、优先引用我”。传统SEO在AI的“黑箱”面前越来越失效&#xff0c;企业必须重新建立一套可…...

对比ubuntu本地直接调用与通过taotoken调用的开发便捷性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比 Ubuntu 本地直接调用与通过 Taotoken 调用的开发便捷性 在 Ubuntu 等 Linux 开发环境中集成大模型能力&#xff0c;开发者通常…...

别再乱点U盘里的.exe了!手把手教你清除‘Usb Disk.exe’病毒并恢复隐藏文件

彻底清除U盘病毒&#xff1a;从识别到恢复的完整实战指南 当你发现U盘里的文件突然"消失"&#xff0c;只剩下一些可疑的.exe文件时&#xff0c;很可能已经遭遇了典型的U盘病毒攻击。这种病毒不仅会隐藏你的重要文档&#xff0c;还可能通过自动运行机制感染整个计算机…...

2026年企业做GEO推广找哪家?推荐几家源头厂家

2026年&#xff0c;GEO赛道正在经历一场剧烈的洗牌。根据界面新闻、极客公园、IT之家及多家第三方机构近期密集发布的行业评测&#xff0c;头部服务商格局已初步成型&#xff0c;但大量贴牌套壳的“伪源头”仍在搅浑市场。企业在选型时最焦虑的问题已经从“要不要做GEO”变成了…...

告别电流畸变!手把手教你用PR调节器搞定开绕组电机零序电流(附Simulink仿真模型)

开绕组电机零序电流抑制实战&#xff1a;PR调节器参数整定与Simulink仿真指南 当开绕组永磁同步电机&#xff08;OEW-PMSM&#xff09;运行在考虑永磁体三次谐波反电动势的场景时&#xff0c;工程师们常会遇到一个棘手问题——三倍频零序电流导致的相电流畸变和转矩脉动。这种现…...

GPU-CPU混合向量检索框架的技术突破与应用

1. 项目概述&#xff1a;GPU-CPU混合向量检索框架的技术突破在当今大规模信息检索和推荐系统领域&#xff0c;向量相似度计算已成为核心瓶颈。传统方案通常面临两难选择&#xff1a;要么完全依赖CPU导致响应延迟居高不下&#xff0c;要么全量使用GPU造成资源严重浪费。VECTORLI…...

Analog Discovery 2:口袋实验室如何用FPGA重塑硬件调试体验

1. 口袋里的实验室&#xff1a;为什么我们需要Analog Discovery 2&#xff1f;作为一名在硬件开发一线摸爬滚打了十多年的工程师&#xff0c;我太熟悉那种面对复杂项目时&#xff0c;被实验室设备“卡脖子”的窘迫感了。你想验证一个想法&#xff0c;或者排查一个棘手的信号问题…...

别再乱写RS485协议了!基于STM32F103C8T6,聊聊工业通讯中帧结构的那些坑

工业级RS485通讯协议设计&#xff1a;从基础到实战的避坑指南 在嘈杂的工厂车间里&#xff0c;一排STM32F103C8T6控制器通过RS485总线连接着二十多台设备。突然&#xff0c;3号节点的温度传感器数据开始随机跳变&#xff0c;而工程师小王发现每当隔壁车间的变频器启动时&#x…...

大语言模型在模块化布局优化中的应用与实战

1. 项目概述&#xff1a;当大语言模型遇见模块化布局优化在芯片设计和建筑规划领域&#xff0c;模块布局优化一直是个令人头疼的NP难问题。想象一下&#xff0c;你面前有16个形状各异的乐高积木&#xff08;模块&#xff09;&#xff0c;需要将它们严丝合缝地拼成一个矩形底板&…...