一、认识Spring两大核心spring ioc和spring aop我们已经学习了spring ioc现在我们来学习spring aop。AOP它的全称是aspect oriented programming面向切面编程。面向切面编程我们的切面是指一类事情这一类事一定是有一个共同点的比如我们的拦截器它呢是对我们接口都可以进行一个拦截再说统一异常他呢是对我们的异常进行统一的处理。所以呢切面其实它是某一类事情是对一类事情的集中处理。我们的拦截器、统一结果返回、统一异常都是aop思想。他们是一个aop思想但不是基于spring aop实现的。二、什么是SpringAopAop是一种思想它的实现方式有很多有spring aop有 aspectj 、CGLIB等。那我们本期要学习的就是由spring来实现的aop思想spring aop。什么场景上使用aop我们在什么场景下使用aop呢我们的拦截器拦截url而我现在有一个需求就是我需要统计各个方法的耗时时间那此时我们的拦截器可以在方法的前面以及方法的后面去定义时间然后进行相差只不过它实现的只能是接口的耗时但他不会对里面的那些方法进行记录比如说你就用这个方法或是多少就用那个方法耗时多少这个我们的拦截就做不到。我们说我们记录一个方法的时间也算是一种统一的事情而且他们的代码都是很相似的可以说是一个公共的代码那如果说我想记录一个接口(方法)的时间的话我们怎么记录呢你看我们去记录时间就是这三行代码然后我们对每个方法都这样写它是一个一致的写法那我们有拦截器的话就把这些给提取出来。可是拦截器呢并不能满足我们的需求此时我们就使用spring aop。为什么呢因为我们的拦截器它的粒度比较粗它呢只针对那个url而我们的spring aop的话它的粒度更加细一点它的一个粒度呢可以是包、类、方法、参数等等各种方式进行拦截。说白了他提供的规则更加多一点。三、SpringAop的使用1. 添加依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency2. 抽取公共代码我们刚刚不是写了一些计算时间的公共代码吗现在我们就是需要把他们给抽出来。其实类似于拦截器你的拦截器的话其实就是把公共的方法给它给抽取出来去拦截这些UrL。2.1、我们就定义一个包aspect切面2.2、那我现在呢是记录一个耗时的时间time aspect。2.3、核心步骤是下面的四步2.4、我们首先给类加一个Aspect注解2.5、接下来就定义方法把这些公共的代码抽出来我们第1步是记录开始时间然后第2步执行我们的目标方法但是这个目标方法你从哪来呢这个目标方法我们肯定是通过参数来传进去要把它封装成一个对象传进来接下来就是执行第三步 计算我们的执行之后的时间2.6、打印日志打印日志我们如何打呢我们调用的是目标方法中的一些方法。那我们获取一下目标方法的签名2.7 让我们定义的这个类生效想让它生效我们首先第1步加入component注解让他交给spring容器管理第2步就是我们得告诉他你这个类要在哪个地方上生效此时我们需要使用一个注解叫做around环绕通知然后我们在参数里面定义一些规则。2.8、返回结果2.9、完整代码packagecom.zhongge.aspect;importlombok.extern.slf4j.Slf4j;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;/** * ClassName TimeAspect * Description TODO 耗时时间 * Author 笨忠 * Date 2026-04-03 10:51 * Version 1.0 */AspectSlf4jComponentpublicclassTimeAspect{Around(execution(* com.zhongge.controller.*.*(..)))publicObjecttimeRecord(ProceedingJoinPointpjp)throwsThrowable{//1. 记录开始时间longstartSystem.currentTimeMillis();//2. 执行目标方法 ProceedingJoinPoint翻译为执行连接点Objectproceedpjp.proceed();//3. 结束时间longendSystem.currentTimeMillis();//打印日志log.info(pjp.getSignature().toString()耗时(end-start)ms);//执行完这个结果 你需要 返回一个东西的returnproceed;}}2.10、运行程序测试一下然后我们虽然说是针对所有的方法但是他的实际意思就是说你这些所有的方法我前端如果去请求这些所有方法中的某一个方法那我这个类就会拿到这个方法并对这个方法进行时间统计。所以他实际每一次执行的都只针对那一个方法。比如我们请求登录路径的方法在比如我们获取图书列表想必也看到了我们前端请求那个方法我们这个aop就会去统计针对这个方法的一个耗时时间所以我们刚刚定义的规则它虽然是针对那个路径所有的类的所有的方法就是说告诉前端你要访问这些方法当中只要你的路径里面有这些方法那么我就会根据你的路径来把这些方法给拿到拿到之后呢我对它进行一个时间的统计也就是说我的作用范围是这些所有的方法但每一次执行我只针对其中的一个方法针对哪一个方法得靠你前端来告诉我。2.11、整理逻辑Aspect:标识这是⼀个切⾯类Around:环绕通知,在⽬标⽅法的前后都会被执⾏.后⾯的表达式表⽰对哪些⽅法进⾏增强.ProceedingJoinPoint.proceed()让原始⽅法执⾏我们通过AOP⼊⻔程序完成了业务接⼝执⾏耗时的统计.通过上⾯的程序,我们也可以感受到AOP⾯向切⾯编程的⼀些优势• 代码⽆侵⼊:不修改原始的业务⽅法,就可以对原始的业务⽅法进⾏了功能的增强或者是功能的改变• 减少了重复代码• 提⾼开发效率• 维护⽅便老铁们本期我们先简单对SpringAOP做个初步认识和上手使用后续内容干货满满记得点赞关注收藏⭐不迷路下一期我们将对SpringAOP进行详细讲解敬请期待