携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
⭐️前面的话⭐️
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee
六、AOP(代理模式)
Spring有两个核心的概念,一个是IOC/DI,一个是AOP。
对于AOP,我们前面提过一句话是:AOP是在不改原有代码的前提下对其进行增强。
对于下面的内容,我们主要就是围绕着这一句话进行展开学习
16 AOP简介
什么是AOP
-
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
- OOP(Object Oriented Programming)面向对象编程
- 不同于OOP的一种编程思想(编程范式)
AOP作用
- 不惊动原始设计的基础上为其进行功能增强,基于代理模式实现。
AOP核心概念
# 什么是AOP?
# AOP的作用是什么?
# AOP中核心概念分别指的是什么?
- 连接点(原始方法)
- 切入点Pointcut(哪些方法要追加功能)(匹配连接点的式子)
- 通知Advice(存放共性功能的方法)
- 通知类(通知方法所在的类)
- 切面Aspect(通知和切入点之间的关系描述)
@Repository
public class BookDaoImpl implements BookDao {
// 计算万次执行消耗的时间
public void save() {
Long startTime = System.currentTimeMillis(); // 记录程序当前执行时间(开始时间)
for (int i = 0;i<10000;i++) { //业务执行万次
System.out.println("book dao save ...");
}
Long endTime = System.currentTimeMillis(); // 记录程序当前执行时间(结束时间)
// 计算时间差
Long totalTime = endTime-startTime;
System.out.println("执行万次消耗时间:" + totalTime + "ms");
}
public void update(){
System.out.println("book dao update ...");
}
public void delete(){
System.out.println("book dao delete ...");
}
public void select(){
System.out.println("book dao select ...");
}
}
- 分别执行其 save , delete , update 和 select 方法后,打印结果如下
-
对于计算万次执行消耗的时间,只有
save方法有相应代码逻辑,为什么delete和update方法也会有呢?为什么
select方法为什么又没有呢?- Spring的AOP,在不改动原有设计(代码)的前提下,想给谁添加功能就给谁添加。(无入侵式)
- Spring到底是如何实现的呢?
- 核心概念
(1)类中的方法叫连接点。如上 BookServiceImpl 中的save 、update 、delete 和 select方法。
(2)需要增强的方法叫切入点。如上的 update 和delete 方法。(会有多个)
(3)存放共性功能的方法叫通知。执行BookServiceImpl的update和delete方法的时候,都被添加了一个计算万次执行消耗时间的功能(共性功能)。(会有多个)
(4)通知和切入点之间的关系描述叫切面。哪个切入点需要添加哪个通知。
(5)通知是一个方法,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫通知类。
# 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
- 在SpringAOP中,理解为方法的执行
# 切入点(Pointcut):匹配连接点的式子
- 在SpringAOP中,一个切入点可以描述一个具体方法,也可也匹配多个方法
- 一个具体的方法:如com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
- 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个# 参数的方法
- 连接点范围要比切入点范围大,是切入点的方法也一定是连接点,但是是连接点的方法就不一定要被增强,所以可能不是切入点。
# 通知(Advice):在切入点处执行的操作,也就是共性功能
- 在SpringAOP中,功能最终以方法的形式呈现
# 通知类:定义通知的类
# 切面(Aspect):描述通知与切入点的对应关系。