layout: post title: "spring-面向切面AOP" subtitle: " "其实就是拦截器"" date: 2018-11-08 06:00:00 author: "青乡" header-img: "img/post-bg-2015.jpg" catalog: true tags: - spring - spring AOP - spring 面向切面
什么是面向切面
拦截器。
怎么使用?
1.管理器 //Advisor(切面)
管理2和3。 spring里面的概念,开发过程中不需要做任何处理和配置。
2.哪些业务类的哪些方法 //Pointcut(切点)
3.在方法的前面、后面还是前面/后面 //Advice(增强)
4.切面类
正常的业务类.方法执行开始之前/完成之后,需要执行的切面类.方法。
以上三个问题,在AOP中占用重要的地位,因为Spring AOP的主要工作就是围绕以上三点展开:Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前、方法后、方法的两端等)。此外,Spring通过Advisor(切面)将Pointcut和Advice两者组装起来。有了Advisor的信息,Spring就可以利用JDK或CGLib的动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象了。
底层实现原理
动态代理。
有2种技术,
1.jdk //面向接口,只能是接口。
1)代理类Proxy
2)业务类InvokerHandler
2.第三方开源-CGLib //可以是类。
问题来了,spring是使用的哪一种代理技术呢?看源码。
源码分析
使用的是CGLib。3.0之前依赖CGLib.jar,之后集成了CGLib.jar,在core.jar里。但是不知道为什么,官方下载的源码proxy这一块代码都没有。
动态代理技术
jdk
研究源码。
CGLib
研究源码,是基于jdk的动态代理技术吗?
面向切面和控制反转有什么关系吗
没有关系。2个独立的核心模块。1个是注入数据,1个是拦截器什么的。但是二者可以结合使用。
1.注入数据
思想沿袭自最早的MVC框架-struts。
2.拦截器
思想沿袭自j2ee里的servlet规范-过滤器,只不过spring的拦截器框架封装的更完善更好用而已。
应用场景
但凡是类似拦截器这样的功能,即拦截每个类做点什么事情,都是面向切面,
1.日志 //进入方法和退出方法
2.执行时间 //性能监控
3.角色和权限
4.事务
工作应用
单机事务
需求
spring事务基于面向切面技术。每个应用程序的标配,每个应用程序都会需要事务功能,所以都会配置事务。
代码
分布式事务
需求
在分布式事务里,有一个需求是需要保存执行成功的方法和失败的方法,怎么保存呢?主活动和子活动保存在了数据库,但是这些子活动不能区分是成功还是失败,怎么区分呢?子活动成功了加一个标志,失败了就没有那个标志。
怎么加标志?就是在方法执行完之后,执行切面类的方法,做一下处理即可。
做一下处理可以,但是切面类怎么知道方法是正常执行成功,还是异常退出呢?如果方法正常执行完成,那么就执行切面的方法;如果方法抛出错误,切面类的方法是不会执行的。
代码实现