您现在的位置是:首页 >学无止境 >Spring AOP网站首页学无止境
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修饰的类.