您现在的位置是:首页 >学无止境 >Spring AOP网站首页学无止境

Spring AOP

正经程序猿 2024-08-18 12:01:02
简介Spring AOP

目录

什么是AOP

为什么要用AOP

Spring AOP要学习什么

AOP的相关概念

切面

切点

通知

连接点

Spring AOP的使用

1.添加Spring Boot AOP框架

2.创建切面

3.创建切点,定义拦截规则

4.创建通知 

5.创建连接点

6.启动项目,访问接口

各类通知的执行

切点表达式

Spring AOP的实现原理


什么是AOP

AOP全称是Aspect Oriented Programming,意思是面向切面编程,它是一种思想,是对某一类事情的集中处理.

比如用户登录权限的校验,我们不使用AOP,要对所有需要判断用户登录的页面,都要各自实现或者调用用户验证的方法.而我们有了AOP之后,我们只需要在某一处配置一下,所有需要判断用户登录页面就全部可以用户登录验证了,不再需要每个方法中都写相同的用户登录验证了.

AOP是一种思想,而Spring AOP是一 个框架,它提供了一种对AOP思想的实现.它们的关系类似于IoC和DI的关系.IoC是思想,DI是具体的实现.


为什么要用AOP

对于功能统一,且使用的地方较多的功能,就可以考虑AOP来统一处理了.使用AOP可以降低代码的耦合性,可以简化代码的开发,便于代码的维护和修改 .

AOP可以实现:

  • 统一的用户登录判断
  • 统一日志记录
  • 统一方法执行时间统计
  • 统一的返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

就是说使用AOP可以扩充多个对象的某个能力,所以AOP可以说是OOP(面向对象编程)的补充和完善.

AOP可以让我们在开发某个功能时更加专一,只需要针对这一功能进行开发,涉及到的其他功能模块的实现我们就可以放到一个公共的地方来集中处理.


Spring AOP要学习什么

1.学习AOP的相关概念

2.学习Spring AOP的使用

3.学习Spring AOP的实现原理


AOP的相关概念

切面

切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包含了连接点的含义.

切面是包含了通知,切点和切面的类,相当于AOP实现的某个功能的集合.

一个项目里面可以包含多个AOP,一个切面就代表某一个AOP的类型.

通俗的说,某一方面的具体内容就是一个切面,比如用户登录判断就是一个"切面",而日志的统计记录是另一个"切面".

切点

切点(Pointcut)是一个方法,它的作用是来定义一个拦截规则.

通知

通知(Advice)相当于方法的具体实现,来执行AOP的业务逻辑.

切面也是由目标的(他必须要完成的工作),AOP术语中,切面的工作就被称为通知.

通知的5种类型

  • 前置通知:在目标方法(实际要执行的方法)调用之前执行的通知;
  • 后置通知:在目标方法调用之后执行的通知;
  • 环绕通知:在目标方法调用前.后都执行的通知,常用于统计方法执行时间;
  • 异常通知:在目标方法抛出异常的时候执行的通知,常用于事务的回滚判断;
  • 返回通知:在目标方法返回的时候通知.常用于校验返回值.

连接点

连接点(Join Point),所有可能触发切点的"点"就是连接点.


Spring AOP的使用

1.添加Spring Boot AOP框架

Spring Boot添加依赖的面板里没有,要去maven仓库添加.

2.创建切面

在启动类同级目录或子目录下创建.

类注解就是让切面随着项目的启动而启动,不能省略.

 

3.创建切点,定义拦截规则

4.创建通知 

 

5.创建连接点

 

为了比较,我们在创建一个ArticleController类

6.启动项目,访问接口

 

可以看到,每次访问UserController里的接口都会触发前置通知.而访问ArticleController里的接口不会触发前置通知.因为我们的拦截规则里面配置了只拦截UserController里的方法.

 


各类通知的执行

 

 


切点表达式

AspectJ ⽀持三种通配符
* :匹配任意字符,只匹配⼀个元素(包,类,或⽅法,⽅法参数)
.. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
+ :表示按照类型匹配指定类的所有类,必须跟在类名后⾯,如 com.cad.Car+ ,表示继承该类的
所有⼦类包括本身
切点表达式由切点函数组成,其中 execution() 是最常⽤的切点函数,⽤来匹配⽅法,语法为:
切点表达式说明
execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)
修饰符和异常可以省略


Spring AOP的实现原理

Spring AOP 是构建在动态代理基础上,因此 Spring 对 AOP 的⽀持局限于⽅法级别的拦截。
Spring AOP ⽀持 JDK Proxy 和 CGLIB ⽅式实现动态代理。默认情况下,实现了接⼝的类,使 ⽤ AOP 会基于 JDK ⽣成代理类,没有实现接⼝的类,会基于 CGLIB ⽣成代理类.

JDK动态代理:速度快,是通过反射来实现动态代理.要求就是被代理类一定要实现接口.

CGLIB是通过代理类的子类来实现动态代理.它不能代理被final修饰的类.


 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。