Spring AOP_01

52 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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方法有相应代码逻辑,为什么deleteupdate 方法也会有呢?

    为什么 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):描述通知与切入点的对应关系。