Spring中的AOP翻转的使用与在事务管理中的表现
Spring框架应该是作为Java开发耳熟能详的一个,并且要能够熟练掌握。但是里面知识点的零碎可能随着时间的流逝,一些知识也会变的陌生起来。Spring这一系列的文章主要是将自己对Spring的一些认识梳理一下,其中这篇文章讲的主要是AOP相关的。
在很早的时候也写过一篇将IOC容器的文章,供君参考,他从Java原生的事务讲起,引入为什么要进行事务,以及原生的事务管理有哪些缺点,我们通过怎么样的方法来进行改进——代理。那么AOP的出现给我们带来了哪些便捷,如果要是让我们自己用原生Java代码实现一个AOP框架那应该怎么做,如何实现。这篇文章也是自己的一篇长文,对于基础概念不是很扎实的同学推荐去看看。
https://blog.csdn.net/lmlzww/article/details/104684088?spm=1001.2014.3001.5501
1、AOP是什么,可以为我们提供什么?
- 面向切面编程,是OOP的延续
- 对业务逻辑的各个部分进行隔离,降低耦合度
- 静非业务逻辑代码从业务逻辑代码中抽离出来
在开头推荐的文章中我们讲了从原生代码的事务管理到利用代理对代码进行封装,再到利用AOP来实现,实际上Spring框架可以看做是给我们提供了一套通过代理等技术对功能进行增强的框架。其中的事务管理是他的一个实现而已。这里我们只不过是拿事务管理这个场景引入AOP如何实现。源代码层面事务管理的实现思路:
- 开启事务
- 进行业务操作
- 没有发生异常进行事务提交
- 出现异常进行事务回滚
2、AOP中的动态代理的类型
- 有接口的情况使用JDK动态代理即可,Proxy.newProxyInstance(),其中三个参数——目标类的来加载器、目标类的接口集、目标类的处理器对象
- 单接口动态代理
- 多接口动态代理
- 没有接口使用CGLIB来进行动态代理:通过创建子类,来实现动态代理
3、AOP中的相关术语
- 连接点:类中的那些方法可以被增强,那些方法就可以叫做连接点
- 切入点:实际被真正增强的方法就叫做切入点
- 通知/增强:实际增强的逻辑部分
- 前置通知
- 后置通知 @AfterReturning 有异常则不执行
- 环绕通知
- 异常通知
- 最终通知——就像是finally的作用 @After 有无异常都执行
- 切面:把通知应用到切入点的过程就是切面,他说的是一个动作
4、AOP操作
- Spring框架一般基于AspectJ来实现AOP,AspectJ是一个单独框架可以单独使用
- 基于XML配置文件
- 基于注解实现
- 切入点表达式是为了知道可以对类中的那个方法进行增强
- 公共切入点抽取,使用@Pointcut进行抽取
- 多个增强类对个方法增强优先级的设置
在增强类上面添加一个@Order的注解,里面设置值,值越小优先级越高
5、通过配置文件实现AOP
6、Spring中如何进行事务管理
- 事务一般添加到Service层中
- 两种事务方式,有一个针对不同框架提供的实现类PlatformTransactionManager
- 编程式事务管理、通过代码进行管理
- 声明式事务管理
- 基于注解进行实现
- 基于xml的形式进行实现
7、基于注解进行事务管理的流程
-
在Spring的配置文件中创建一个事务管理器
-
在事务管理器中添加链接信息
-
再Spring配置文件中开启事务注解
-
在Service类上面添加事务注解@Transactional,如果要是添加到类则作用与所有的方法如果要是添加到方法上则只作用于一个方法
8、事务注解中详细的配置
- propagation:事务传播行为
- 当一个事务方法被另一个事务方法调用的时候应该如何处理
- requeired:如果有事务在运行当前的方法就在这个事务内运行,否则就启动一个新的事务并在自己的事务内运行
- required_new:当前方法必须启动新事物,并在自己的事务内运行,如果有事务在运行应该将它挂起
- supports: 如果有事务在运行当前的方法就在这个事务内运行,否则他可以不运行在事务中
- not_supported:当前方法不应该运行在事务中,如果有运行的事务则将它挂起
- isolation:多事务操作之间不产生影响,对应的也就是数据库层面上的几种隔离级别
- Read uncommitted
- read committed
- repeatable read
- serializable
- timeout:超时时间
- 事务需要在一定时间内进行提交,如果不提交进行回滚
- 默认的超时时间为-1,
- readOnly:是否只读
- 如果设置为只读那么这个事务内就只能够做查询操作
- rollbackFor:回滚
- 设置出现哪些异常进行回滚
- noRollbackFo:不会滚
- 设置出现哪些异常不进行回滚