- AOP:Aspect Oriented Programming,面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
- OOP引入封装、继承、多态等概念来建立一种对象层次结构
- AOP则利用一种称为“横切”的技术,剖开对象内部,并将公共行为封装到可重用模块,从而减少重复代码,降低耦合。
二、SpringAOP术语
AOP术语:
- 通知(Advice)
- 连接点(Join point)
- 切点(Poincut)
- 切面(Aspect)
- 织入(Weaving)
- 大多数用于描述AOP功能的术语并不直观,为了理解AOP,我们必须了解这些术语。
- 切面是指封装横切到系统功能的类,包含通知和切点
- 切点定义切面插入在哪些方法上,确定切面使用范围
- 通知定义了切点处所要执行的程序代码以及执行时机
- 连接点是在应用执行过程中满足切点范围的具体的点
- 织入是把切面插入到目标对象上
三、SpringAOP实现
2、使用@Aspect定义切面,使用@Pointcut定义切点,使用@Before、@After、@Around、@AfterReturning、@AfterThrowing定义通知的应用时机
四、AOP作用和优势
作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强
优势:减少重复代码,提高开发效率,便于维护。
底层:实际上,AOP的底层是通过Spring提供的的动态代理技术实现的。在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
五、AOP的开发
- 连接点 :编写核心业务代码(目标类的目标方法)
- 通知 :编写切面类,切面类中有通知(增强功能方法)
- 组装切面 :在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
六、事务的概念
事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。
七、事务的ACID原则
- 原子性(Atomicity):一个事务已经是一个不可再分割的工作单位。事务中的全部操作要么都做;要么都不做
- 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
- 隔离性(Isolation):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
- 持久性(Durability):一个事务一旦提交,它对数据库中数据的改变会永久存储起来。其他操作不会对它产生影响
八、事务的隔离级别
Spring事务隔离级别
- DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。(Mysql 默认repeatable_read, Oracle 默认read_commited)
- 未提交读(read_uncommited)
- 已提交读 (read_commited)
- 可重复读 (repeatable_read)
- 串行化的 (serializable)
九、不考虑隔离性引发安全性问题:
- 脏读 :在一个事务中读取到了另外一个事务修改的【未提交的数据】,而导致多次读取同一个数据返回的结果不一致 (必须要解决的)
- 不可重复读 : 在一个事务中读取到了另外一个事务修改的【已提交的数据】,而导致多次读取同一个数据返回的结果不一致
- 幻读(虚读): 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录
十、事务的使用方法
- 编程式事务管理:通过TransactionTemplate手动管理事务,在实际应用中很少使用
- 声明式事务管理(需要使用xml配置):通过AOP实现事务管理,代码侵入性小
十一、Spring的事务管理
在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于事务处理的API。Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。
十二、事务管理的核心接口
在Spring的所有JAR包中,包含一个名为spring-tx-5.3.9的JAR包,该包就是Spring提供的用于事务管理的依赖包。在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus
1.Platform TransactionManager
PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了三个事务操作的方法,具体如下:
PlatformTransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。该接口常见的几个实现类如下:
2.TransactionDefinition
TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务基本属性,并提供了获取事务基本属性的方法,具体如下:
3.TransactionStatus
TransactionStatus接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:
十三、事务的基本事务属性
传播行为(propagation behavior):当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。Spring定义了七种传播行为(Page113:表4-4)
隔离级别(isolation level):定义了一个事务可能受其他并发事务的影响程度。多个事务并发运行,经常会操作相同的数据来完成各自的任务,可能会出现脏读,不可重复读和幻读的问题。隔离级别有四种( Page113:表4-5 )
是否只读(isReadOnly):如果一个方法内都是对数据库的select操作,那么可以设置方法事务为只读,数据库也会对该事务进行特定的优化。只读事务内不能有insert、update、delete的操作
事务超时(timeout):事务可能设计对后端数据库的锁定,所以长时间的事务运行会不必要的占用数据库资源,设置事务超时时间可以及时释放资源
十四、事务管理的方式
十五、编程式事务管理缺点
- 编程式事务管理必须要在业务逻辑中包含额外的事务管理代码。和业务逻辑代码产生了耦合,产生了代码冗余,不方便代码的维护和扩展。
- 声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率,所以在实际开发中,通常都推荐使用声明式事务管理。
十六、声明式事务管理的原理
通过AOP技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中
十七、如何实现Spring的声明式事务管理?
Spring的声明式事务管理可以通过两种方式来实现,一种是基于XML的方式,另一种是基于注解的方式。接下来的两个小节中,将对这两种声明式事务管理方式进行详细讲解。
- 1.基于XML方式的声明式事务
基于XML方式的声明式事务是在配置文件中通过<tx:advice>元素配置事务规则来实现的,然后通过使用<aop:config>编写的AOP配置,让Spring自动对目标生成代理。
配置<tx:advice>元素的重点是配置<tx:method>子元素,上图中使用灰色标注的几个属性是<tx:method>元素中的常用属性。
步骤1:添加事务管理器组件
在applicationContext.xml中配置一个事务管理器组件,提供对事务处理的全面支持和统一管理
步骤2:使用<tx:advice>标签配置事务规则
步骤3:使用<aop:config>配置事务切面
使用<aop:config>标签配置事务切面,并应用事务规则
- 2.基于注解方式的声明式事务
步骤1:配置事务管理器
在applicationContext.xml中配置一个事务管理器组件,提供对事务处理的全面支持和统一管理
步骤2:注册事务注解驱动
在applicationContext.xml中添加对注解配置事务的支持
步骤3:注册事务注解驱动
在需要事务管理的类或方法上使用@Transactional注解
十八、注解方式事务失效的几种场景