1.Spring的事务管理(保证事务的一致性)
1)事务概念
*事务是与数据库操作有关,主要用于insert,update,delete语句
*事务一般默认一个DML语句就是一个独立事务,
如果一个操作就涉及一个DML语句可以采用默认处理
*事务是用于保障多个DML语句操作完整性,
如果一个操作涉及多个DML过程,必须采用事务控制
2)Spring对事务的支持
*Spring提供一些API,封装了数据库的事务管理功能
*JDBC和MyBatisL:使用 DataSourceTransactionManager
con.setAutoCommit(false)取消自动提交 con.commit()提交 con.rollback()回滚
*Hibreanate:使用HibernateTransactionManager
3)Spring事务控制使用时,主要是基于配置方法使用,不需要Java代码控制
4)Spring事务控制方法
*在Spring容器配置中定义一个bean组件(DataSourceTransactionManager)
*在spring容器配置开启事务注解的支持(@Transactional)
*在目标组件方法前或类前追加@Transactional标记
5)使用Spring进行事务管理,可以通过配置追加事务功能,灵活,简单,
不需要对原有组件方法代码修改
6)Spring事务控制特性
*@Transactional注解有4个属性,可以指定事务管理细节
默认情况下4个属性值为:
a. readOnly=false 控制事务为只读型还是可读写型
只读型(true):只支持select
可读写型(false):支持select,update,insert,delete
建议:只包含select的业务方法,可以采用只读型事务控制
b. rollbackFor=RuntimeException.class
默认业务方法遇到RuntimeException回滚方法中的SQL
典型RuntimeException有:空指针,类型转换,数组下标越界等
非RuntimeException有:IOException,FileNotFountException
c. propagation=REQUIRED 事务传播性
当带有@Transactional方法调用另一个带有该标记的方法时,才会有事务传播,
若第二个带有@Transactional的propagation属性为REQUIRED类型时,
表示第二个方法和前面第一个方法为一个整体,采用一个事务控制,
可以撤销第一个方法SQL
若第二个带有@Transactional的propagation属性为REQUIRED_NEW类型时,
表示第二个方法采用一个新事务控制,不能撤销第一个方法SQL
d. isolation=DEFAULT 控制事务的隔离级别
默认为DEFAULT,意思是按数据库隔离级别决定,例如Oracle默认为READ_COMMITED
意义:将涉及相同数据的多个事务操作,根据需要隔离开
隔离级别分为以下几种:(级别由低到高)
READ_UNCOMMITTED 读未提交
READ_COMMITTED 读已提交
REPEATABLE_READ 可重复读
SERIALIZABLE 序列化
级别越低,并发处理能力越强,但是安全性越差
级别越高,并发处理能力越弱,但是安全性越强
2.Spring AOP
1)AOP是面向切面编程 Aspect Oriented Programming
OOP是面向对象编程 Object Oriented Programming
2)AOP是以OOP为基础
3)AOP思想:用于处理共通业务,将共通业务和传统的业务隔离开,单独封装成对象
之后通过配置方式将共通组件和传统业务组件关联在一起
4)AOP优点:灵活,降低共通和传统业务的耦合度,
可以在不修改原有业务组件代码情况下,追加新的功能处理
5)IOC(解决两个普通组件关联,降低耦合度)
6)相关概念:
*切面(Aspect)
指封装一个共通处理逻辑,在另外一批组件方法中相同时刻进行调用
切面组件就是指共通处理组件,具备向其他组件切入功能
*切入点(Pointcut)
指定(要切入的)目标组件及其方法,Spring提供了多种表达式
a.方法限定表达式(匹配组件部分方法)
execution(修饰符? 返回类型 方法名(参数) 抛出异常?)
eg://匹配load打头的方法
execution(* load*(...))
//匹配UserService组件的load打头的方法
execution(* org.service.UserService.load*(...))
//匹配org.service包下所有类的所有方法
execution(* org.service.*.*(...))
//匹配org.service包及子包所有类的所有方法
execution(* org.service..*.*(...))
b.类型限定表达式(匹配组件所有方法)
within(组件类型)
//匹配UserService组件所有方法
withid(org.service.UserService)
//匹配org.service包下所有组件所有方法
withid(org.service.*)
//匹配org.service包及其子包所有组件所有方法
withid(org.service..*)
c.名称限定
bean(组件的id名)
//匹配id=userService组件的所有方法
bean(userService)
//匹配id名以Service结尾的所有组件的所有方法
bean(*Service)
*通知(Advice)
指定切入的实际,例如方法前切入,方法后切入等
在Spring中提供了5种基本通知类型
前置通知:在目标方法前切入追加功能 aop:before @Before
后置通知:在目标方法后切入追加功能 aop:after-returning @AfterReturning
异常通知:在目标方法抛出异常后切入追加功能 aop:after-throwing @AfterThrowing
最终通知:在目标方法后切入追加功能 aop:after @After
环绕通知:在目标方法前和后切入追加功能 aop:around @Around
*动态代理(AutoProxy) 一种设计模式
原理:Spring采用动态代理技术实现了AOP编程
过程:当使用SpringAOP之后,Spring容器返回的对象,
是利用动态代理技术生成一个新类型,
该类型将原有组件方法进行了重写,重写方法中调用原有组件业务+切面业务方法
Spring框架在实现AOP时,采用了两种动态代理技术的实现方法
-使用JDK java.reflect.Proxy API生成新类型
目标组件有接口,默认采用此方法
public class 新类型 implements 目标接口{}
-使用CGLIB技术生产新类型(生成子类)
目标组件没有接口,默认采用此方法
public class 新类型 extends 目标{}
1)事务概念
*事务是与数据库操作有关,主要用于insert,update,delete语句
*事务一般默认一个DML语句就是一个独立事务,
如果一个操作就涉及一个DML语句可以采用默认处理
*事务是用于保障多个DML语句操作完整性,
如果一个操作涉及多个DML过程,必须采用事务控制
2)Spring对事务的支持
*Spring提供一些API,封装了数据库的事务管理功能
*JDBC和MyBatisL:使用 DataSourceTransactionManager
con.setAutoCommit(false)取消自动提交 con.commit()提交 con.rollback()回滚
*Hibreanate:使用HibernateTransactionManager
3)Spring事务控制使用时,主要是基于配置方法使用,不需要Java代码控制
4)Spring事务控制方法
*在Spring容器配置中定义一个bean组件(DataSourceTransactionManager)
*在spring容器配置开启事务注解的支持(@Transactional)
*在目标组件方法前或类前追加@Transactional标记
5)使用Spring进行事务管理,可以通过配置追加事务功能,灵活,简单,
不需要对原有组件方法代码修改
6)Spring事务控制特性
*@Transactional注解有4个属性,可以指定事务管理细节
默认情况下4个属性值为:
a. readOnly=false 控制事务为只读型还是可读写型
只读型(true):只支持select
可读写型(false):支持select,update,insert,delete
建议:只包含select的业务方法,可以采用只读型事务控制
b. rollbackFor=RuntimeException.class
默认业务方法遇到RuntimeException回滚方法中的SQL
典型RuntimeException有:空指针,类型转换,数组下标越界等
非RuntimeException有:IOException,FileNotFountException
c. propagation=REQUIRED 事务传播性
当带有@Transactional方法调用另一个带有该标记的方法时,才会有事务传播,
若第二个带有@Transactional的propagation属性为REQUIRED类型时,
表示第二个方法和前面第一个方法为一个整体,采用一个事务控制,
可以撤销第一个方法SQL
若第二个带有@Transactional的propagation属性为REQUIRED_NEW类型时,
表示第二个方法采用一个新事务控制,不能撤销第一个方法SQL
d. isolation=DEFAULT 控制事务的隔离级别
默认为DEFAULT,意思是按数据库隔离级别决定,例如Oracle默认为READ_COMMITED
意义:将涉及相同数据的多个事务操作,根据需要隔离开
隔离级别分为以下几种:(级别由低到高)
READ_UNCOMMITTED 读未提交
READ_COMMITTED 读已提交
REPEATABLE_READ 可重复读
SERIALIZABLE 序列化
级别越低,并发处理能力越强,但是安全性越差
级别越高,并发处理能力越弱,但是安全性越强
2.Spring AOP
1)AOP是面向切面编程 Aspect Oriented Programming
OOP是面向对象编程 Object Oriented Programming
2)AOP是以OOP为基础
3)AOP思想:用于处理共通业务,将共通业务和传统的业务隔离开,单独封装成对象
之后通过配置方式将共通组件和传统业务组件关联在一起
4)AOP优点:灵活,降低共通和传统业务的耦合度,
可以在不修改原有业务组件代码情况下,追加新的功能处理
5)IOC(解决两个普通组件关联,降低耦合度)
6)相关概念:
*切面(Aspect)
指封装一个共通处理逻辑,在另外一批组件方法中相同时刻进行调用
切面组件就是指共通处理组件,具备向其他组件切入功能
*切入点(Pointcut)
指定(要切入的)目标组件及其方法,Spring提供了多种表达式
a.方法限定表达式(匹配组件部分方法)
execution(修饰符? 返回类型 方法名(参数) 抛出异常?)
eg://匹配load打头的方法
execution(* load*(...))
//匹配UserService组件的load打头的方法
execution(* org.service.UserService.load*(...))
//匹配org.service包下所有类的所有方法
execution(* org.service.*.*(...))
//匹配org.service包及子包所有类的所有方法
execution(* org.service..*.*(...))
b.类型限定表达式(匹配组件所有方法)
within(组件类型)
//匹配UserService组件所有方法
withid(org.service.UserService)
//匹配org.service包下所有组件所有方法
withid(org.service.*)
//匹配org.service包及其子包所有组件所有方法
withid(org.service..*)
c.名称限定
bean(组件的id名)
//匹配id=userService组件的所有方法
bean(userService)
//匹配id名以Service结尾的所有组件的所有方法
bean(*Service)
*通知(Advice)
指定切入的实际,例如方法前切入,方法后切入等
在Spring中提供了5种基本通知类型
前置通知:在目标方法前切入追加功能 aop:before @Before
后置通知:在目标方法后切入追加功能 aop:after-returning @AfterReturning
异常通知:在目标方法抛出异常后切入追加功能 aop:after-throwing @AfterThrowing
最终通知:在目标方法后切入追加功能 aop:after @After
环绕通知:在目标方法前和后切入追加功能 aop:around @Around
*动态代理(AutoProxy) 一种设计模式
原理:Spring采用动态代理技术实现了AOP编程
过程:当使用SpringAOP之后,Spring容器返回的对象,
是利用动态代理技术生成一个新类型,
该类型将原有组件方法进行了重写,重写方法中调用原有组件业务+切面业务方法
Spring框架在实现AOP时,采用了两种动态代理技术的实现方法
-使用JDK java.reflect.Proxy API生成新类型
目标组件有接口,默认采用此方法
public class 新类型 implements 目标接口{}
-使用CGLIB技术生产新类型(生成子类)
目标组件没有接口,默认采用此方法
public class 新类型 extends 目标{}