1.AOP总结:面向切面编程,在不惊动原始基础上为方法进行功能增强。
2.AOP核心概念:
(1)代理:SpringAOP的核心是采用代理模式
(2)连接点:在SpringAOP中,理解为任意方法的执行
(3)切入点:匹配连接点的式子,也是具有共性功能的方法描述
(4)通知:若干个方法的共性功能,在切入点处执行,最终体现为一个方法。
(5)切面:描述通知和切入点的对应关系
(6)目标对象:被代理的原始对象成为目标对象
3.切入点表达式格式
(1)动作关键词(访问修饰符 返回值 包名.类名/接口名 (参数)异常名)
(2)切入点表达式描述通配符(快速描述、范围描述)
*:匹配任意符号(常用)
… :匹配多个连续的任意符号(常用)
+:匹配子类类型
4.通知类型
(1)前置通知
(2)后置通知
(3)环绕通知(important)
1)环绕通知依赖形参ProceedingJoinPoint才能实现对原始方法的调用
2)环绕通知开源隔离原始方法的调用执行
3)环绕通知返回值设为Object类型
4)环绕通知开源对原始方法调用过程中出现的异常进行处理。
(4)返回后通知
(5)抛出异常后通知
补充:
(1)获取切入点方法的参数:
JointPoint:适合前置、后置、返回后、抛出异常后通知,设置为方法的第一个形参。
ProceedJointPoint:适用于环绕通知
(2)获取切入点方法返回值
返回后通知
环绕通知
(3)获取切入点方法运行异常信息
抛出异常后通知
环绕通知
5.Spring事务简介
(1)事务作用:在数据层保障一系列数据库操作(同成功同失败)
(2)Spring事务作用:在数据层或业务层保障一些列的数据库操作(同成功同失败)
接口是public interface platformTransactionManager(平台事务管理器)
方法有commit、rollback
接口实现类是public class DataSourceTransactionManager
例子:模拟银行账户间转账业务
需求:实现任意两个账户间转账操作
(A账号减钱,B账户加钱)
1)数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)
2)业务层提供转账操作(transfer),调用加钱和减钱操作。
3)提供2个账号和操作金额执行转账操作
4)基于Spring整合MyBatis环境搭建上述操作
结果分析:
原本数据库中A,B的账户金额都是1000.
1)程序正常执行,账户金额A-B+
2)程序出现异常后,转账失败。异常之前操作成功,异常之后操作失败,整体业务失败。
(3)在业务层的接口,添加注解@Transaction
(4)在jdbc的配置中,通过Bean引入平台事务管理器的操作(DataSource dataSource)
(5)接口实现类先注释掉异常
(6)运行test,成功
(7)验证使用Trasaction事务之后数据库,会不会出现同成功同失败的效果。
总结:
6.Spring事务角色
事务管理员、事务协调员
MybaticsConfig的SqlSessionFactory的DataSource和JdbcConfig的DataSource不是同一个,则不能运行成功。本次代码能运行成功,是因为他们是通过同一个数据源DataSource进行管理.
7.Spring事务属性
事务相关配置,案例:转账业务追加日志,事务传播行为
内存异常,运行异常才能回滚。IOException不回滚,出现这种情况,我们要在接口的事务中添加rollbackfor
(1)案例:转账业务追加日志
需求:实现任意两个账户间转账操作,每次转账操作在数据库留痕。
(A减钱,B加钱,数据库记录日志)
1)基于转账操作案例添加日志模块,实现数据库中记录日志
2)业务层转账操作(Transfer),调用减钱、加钱与记录日志功能,实现预期效果。
无论转账操作是否成功,都进行转账操作的日志留痕。
<1>REQUIRED(默认),事务管理员开启事务,事务协调员加入事务;事务管理员如果没有事务 ,事务协调员新建事务。(但是这个造成了如果在转账中出现了i/0异常,不管转账是否成功,日志的信息并不会在数据库出现,虽然金额没错保持原样,但是日志信息没有保存)
<2>REQUIRED_NEW,事务管理与开启事务,事务协调员可以新建事务;如果事务协调员没有事务,则事务协调员也会开启任务。所以要在业务层接口添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务)