AOP
OOP 面向对象编程 AOP 面向切面编程
AOP是一种思想,对某一类事情的集中处理
Spring AOP是一个框架,提供了一种对AOP思想的实现
主要为解耦而生
AOP的组成
++切面、连接点、切点、通知++
1.切面:定义AOP业务类型 当前AOP是干嘛得
2.连接点: 调用AOP得地方叫做一个连接点
3.切点: 定义AOP拦截规则
4.通知:定义什么时候干什么事情
4.1 前置通知:拦截得目标方法之前执行的通知
4.2 后置通知:拦截得目标方法之后的通知
4.3 返回之后通知: 拦截的目标方法返回数据之后通知
4.4 抛出异常之后的通知:拦截的目标方法抛出异常之后执行的通知
4.5 环绕通知 在拦截方法之前后都执行的通知
主方法一定要和其他包同级或者比其他包高级 不能低级 低级的无法执行到高级
实现Spring AOP
1.添加Spring AOP框架支持
2.定义切面和切点
3.定义通知
![](https://img-blog.csdnimg.cn/direct/40e21fa442cb4788ad631a4cceb54427.png)
![](https://img-blog.csdnimg.cn/direct/557c9567e7d94a2189d1be4c23399a81.png)
当浏览器访问这个临时方法时,会优先被拦截执行
![](https://img-blog.csdnimg.cn/direct/118e5a1a681d4c4e92a80da67f0da5a8.png)
一个切面可以有多个切点
![](https://img-blog.csdnimg.cn/direct/d1e63ebf35e34d3da35f90a5088a5b4a.png)
对不同的切点定义不同的通知
![](https://img-blog.csdnimg.cn/direct/0063672adf094472b9cf6758b3683d1e.png)
![](https://img-blog.csdnimg.cn/direct/f00f8cfe040d49c8959cb53b7bcdd592.png)
![](https://img-blog.csdnimg.cn/direct/1d8c7269b50349b795cf04881b0e1a1c.png)
环绕通知与其他通知不同,1.它有返回值2.它有参数3.它同时拥有前置,后置通知
![](https://img-blog.csdnimg.cn/direct/94ff9c30ee924e6ab959459a3a05e44b.png)
当一个切点既有前置通知,后置通知,又有环绕通知时
![](https://img-blog.csdnimg.cn/direct/634cdce1b63f483d925be1cc8c61712d.png)
那么环绕通知的前置优先级最高,环绕通知的后置通知优先级最低
织入:代理的生成时机
编译期类->加载期->运行期
JDK和CGLIB的区别
JDK实现,要求被代理类必须实现接口
CGLIB实现,被代理类可以不实现接口
总结
AOP时对某方面能力的统一实现,是一种思想,而Spring AOP是对AOP的具体实现,Spring AOP通过Aspecto注解的方式实现AOP的功能
Spring AOP的实现步骤
1.添加Spring AOP框架支持
2.定义切面和切点
3.定义通知
Spring AOP是通过动态代理的方式,在运行期将AOP代码织入到程序中的,它的实现方式有两种:JDK Proxy和CGLIB
Spring拦截器
1.创建自定义拦截器,实现Handlerinterceptor接口的preHandle方法
2.将自定义拦截器加入WebMvcConfigurer的addinterceptors方法中
创建一个普通登录校验,和测试方法
![](https://img-blog.csdnimg.cn/direct/933fc3de65e8441aa0ce9044a7dc0130.png)
1.创建自定义拦截器,实现Handlerinterceptor接口的preHandle方法
![](https://img-blog.csdnimg.cn/direct/66f5e5c7a4df44ca92b53062be07cce8.png)
2.将自定义拦截器加入WebMvcConfigurer的addinterceptors方法中
![](https://img-blog.csdnimg.cn/direct/33b755e2334840e5afae983bff117441.png)
当访问test2时,会被拦截
![](https://img-blog.csdnimg.cn/direct/179b8525cadb44d88aa71958671adbe5.png)
当第一次访问login时,虽然没被拦截器拦截,但是账号密码错误,依旧为false
![](https://img-blog.csdnimg.cn/direct/e6c0fb30b93843ad92274068bc44410a.png)
当账号密码输入正确时,就会创建session,也就是浏览器内的cookie
![](https://img-blog.csdnimg.cn/direct/af97c6fec0854f6e810ca5b4180df54e.png)
这时就有了session,这样拦截器就允许test2执行了
![](https://img-blog.csdnimg.cn/direct/f2f45cb2f7f24419ab924f7b8b9f577e.png)
统一异常处理
![](https://img-blog.csdnimg.cn/direct/eee4801411ce49159fbb2a0aef15edad.png)
统一数据返回格式
实现接口ResponseBodyAdvice的supports方法和beforeBodyWrite方法
![](https://img-blog.csdnimg.cn/direct/9e1705b346494239abe155684fb697d2.png)