Spring AOP从0到1

Spring有两大核心:

1、IoC 控制反转

2、AOP 面向切面编程

AOP:切面就是指某⼀类特定问题, 所以AOP也可以理解为面向特定⽅法编程.

引入AOP依赖

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

Spring AOP详解

1、分为5个核心

1.1、切点(Pointcut)

Pointcut 的作⽤就是提供⼀组规则 (使⽤ AspectJ pointcut expression language 来描述), 告诉程序对哪些⽅法来进⾏功能增强

上⾯的表达式execution(* com.example.aop.aspect.*.*(..))就是切点表达式.

1.2、连接点

满足切点表达式规则的⽅法, 就是连接点. 也就是可以被AOP控制的⽅法

所有com.example.aop.aspect路径下的方法都是连接点

1.3、通知

通知就是具体要做的⼯作, 指哪些重复的逻辑,也就是共性功能(最终体现为⼀个⽅法)

比如上述程序中记录业务⽅法的耗时时间, 就是通知

1.4、切面

切⾯(Aspect) = 切点(Pointcut) + 通知(Advice)

切⾯既包含了通知逻辑的定义, 也包括了连接点的定义.

2、通知类型

  1. @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
  2. @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
  3. @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
  4. @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏
  5. @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏

3、@PointCut

上面的代码可以看到,路径是很多重复的切点,要是更改的话,会非常麻烦,Spring提供了 @PointCut 注解, 把公共的切点 表达式提取出来, 需要⽤到时引⽤该切⼊点表达式即可

结果如下:

3、切⾯优先级 @Order

当我们在⼀个项⽬中, 定义了多个切⾯类时, 并且这些切⾯类的多个切⼊点都匹配到了同⼀个⽬标⽅法. 当⽬标⽅法运⾏的时候, 这些切⾯类中的通知⽅法都会执⾏, 那么这⼏个通知⽅法的执⾏顺序是什么样的呢?

当我们创建3个切面类之后的打印如下:


存在多个切⾯类时, 默认按照切⾯类的类名字⺟排序:

  1. @Before 通知:字⺟排名靠前的先执⾏
  2. @After 通知:字⺟排名靠前的后执⾏

但这样的排序,在工作中是不方便的,所以我们要借助注解@Order

排序会根据注解@Order里面的数字进行排序,数字越大越靠后

AOP面向切面编程的⼀些优势:

  1. 代码⽆侵⼊: 不修改原始的业务⽅法, 就可以对原始的业务⽅法进⾏了功能的增强或者是功能的改
  2. 减少了重复代码
  3. 提⾼开发效率
  4. 维护⽅便
相关推荐
专注VB编程开发20年4 分钟前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
周某某~7 分钟前
四.抽象工厂模式
java·设计模式·抽象工厂模式
用户67570498850234 分钟前
告别数据库瓶颈!用这个技巧让你的程序跑得飞快!
后端
异常君34 分钟前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
烙印60138 分钟前
MyBatis原理剖析(二)
java·数据库·mybatis
你是狒狒吗41 分钟前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
勤奋的知更鸟1 小时前
Java编程之组合模式
java·开发语言·设计模式·组合模式
千|寻1 小时前
【画江湖】langchain4j - Java1.8下spring boot集成ollama调用本地大模型之问道系列(第一问)
java·spring boot·后端·langchain
程序员岳焱1 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql