前言
- 本章节主要来聊一聊Spring的动态代理与AOP编程的关系,以及Spring处理事务的几个注意点
1. Spring的代理模式
1. Spring框架它最大的特点就是封装了大量
的设计模式,前面的工厂部分它封装的是"工厂设计模式"--->而
"AOP编程"它封装了23种设计模式当中一种设计模式"代理设计模式"。
2. 在Spring中代理模式的开发分为两种:静态代理模式 + 动态代理模
式。
2.1 静态代理问题
⑴ 静态类文件数量过多,不利于项目管理
--->若是存在一个UserServiceImpl目标类,就需要提供相应的
UserServiceProxy的代理类。
--->若在增加另一个OrderServiceImpl目标类,相应的也要再提供一个
OrderServiceProxy的代理类。
--->若此时存在1000个目标类,那就相应的需要去提供1000个代理类,
那这样'类的数量'就成倍的增长。其实不管是User的代理类,还是Order
的代理类他们完成的额外功能都是增加'日志Log额外功能',因此这种做
相同额外功能的代理类数量过多是没有意义的,因为他们毕竟做的是同一
件事。
⑵ 额外功能维护性差
--->若是相同的额外功能被应用到多个代理类中,若日后这个'额外功
能'需要修改,那么就需要去逐个对每一个用到此额外功能的代理类中去
修改,这样就造成了维护性别差的效果。
--->代理类中额外功能修改复杂(较麻烦)。
因此对于'静态代理'的弊端,Spring框架为我们提供了一种更优秀的代理
创建方式"Spring的动态代理开发"。
2.2 Spring的动态代理开发的四个步骤:
⑴ 目标对象
⑵ 额外功能
⑶ 切入点
⑷ 组装
2. AOP编程
1. AOP编程开发步骤,如下所示↓:
⑴ 原始对象
⑵ 额外功能(MethodInterceptor接口)
⑶ 切入点
⑷ 组装切面(额外功能+切入点)
◆:AOP编程的开发步骤与动态代理步骤大致相同。因此此时说的
AOP编程基本上就是之前说的"Spring的动态代理编程"。
2.1 AOP编程说明
1. 实现AOP编程有两种方式:基于注解方式 + 使用注解方式
2. 以下对基于注解方式实现AOP编程的大致步骤:
-->不管他是否是基于注解,都是来实现AOP编程的。因此它的AOP
开发步骤都是与前面'不基于注解实现AOP编程'的步骤是一致的。
⑴ 原始对象
⑵ 额外功能
⑶ 切入点
⑷ 组装切面
3. Spring的事务处理
3.1 事务概念
1. 什么是事务?
⑴ 事务:保证业务操作完整性的一种数据库机制
--->"保证业务操作完整性"说明:一个业务当中涉及到的多步操作,要么
一起成功,要么一起失败,而且不能产生相互影响。
2. 事务的4个特点:A,C,I,D
⑴ A:原子性
⑵ C:一致性
⑶ I:隔离性
⑷ D:持久性
3.2 Spring事务实现的两种方式
1. Spring实现事务的方式有两种:基于@Transaction + 便签式事务
配置,下面主要对基于@Transaction注解方式大致开发步骤的说明。
3. 以下讲解"Spring框架如何来控制事务"我们之前说过事务是业务层中
的'额外功能',既然是额外功能最好的办法就是通过AOP的方式去开发,
所以Spring控制事务的方式就是通过AOP来完成的。
--->那既然Spring控制事务的方式是'AOP'的方式,那Spring事务的开
发步骤就是我们前面所说的'动态代理的四个编程步骤',如下所示↓:
a. 原始对象
b. 额外功能
c. 切入点
d. 组装切面
2.1 对于使用@Transaction注解实现事务(额外功能)中,我们可以自行
配置@Transaction中的如下五个属性做相应的配置:
-.隔离属性
-.传播属性
-.只读属性
-.超时属性
-.异常属性
3.2.1 如何添加@Transaction注解的事务属性
1. 如何添加事务属性?
--->在编程当中我们如何为事务添加上这5个事务属性,进而描述事务的
一些特点。
⑴ 我们实现实现'事务'编程的步骤中,对于'切入点'的实现我们使用的
是'@Transaction()注解'那么在这个注解当中,我们就可以为事务设置
上对应的"5个事务属性"。
2. 利用@Transaction()注解,给事务添加属性
⑴ @Transaction(isloation=) -->设置事务的'隔离属性',并在等号
后面对属性赋值。
⑵ @Transaction(propagation=) -->设置'传播属性',并在等号后面
对属性赋值。
⑶ @Transaction(readOnly=) -->设置'只读属性',并在等号后面对
属性赋值。
⑷ @Transaction(timeout= ) -->设置'超时属性',并在等号后面对
属性赋值。
⑸ @Transaction(rollbackFor=, noRollbackFor=,)
--->对于'异常属性',它在添加属性的时候它有两个对应的值:
rollbackFor=, noRollbackFor=,