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、通知类型
- @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
- @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
- @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
- @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏
- @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏
3、@PointCut
上面的代码可以看到,路径是很多重复的切点,要是更改的话,会非常麻烦,Spring提供了 @PointCut 注解, 把公共的切点 表达式提取出来, 需要⽤到时引⽤该切⼊点表达式即可
结果如下:
3、切⾯优先级 @Order
当我们在⼀个项⽬中, 定义了多个切⾯类时, 并且这些切⾯类的多个切⼊点都匹配到了同⼀个⽬标⽅法. 当⽬标⽅法运⾏的时候, 这些切⾯类中的通知⽅法都会执⾏, 那么这⼏个通知⽅法的执⾏顺序是什么样的呢?
当我们创建3个切面类之后的打印如下:
- @Before 通知:字⺟排名靠前的先执⾏
- @After 通知:字⺟排名靠前的后执⾏
但这样的排序,在工作中是不方便的,所以我们要借助注解@Order
排序会根据注解@Order里面的数字进行排序,数字越大越靠后
AOP面向切面编程的⼀些优势:
- 代码⽆侵⼊: 不修改原始的业务⽅法, 就可以对原始的业务⽅法进⾏了功能的增强或者是功能的改
- 减少了重复代码
- 提⾼开发效率
- 维护⽅便