AOP注解开发(基于AspectJ)
将目标类交给Spring
将切面类交给Spring
在配置文件中打开AOP注解
在切面类上加上@Aspect //将其注解为切面类
在切面类的方法上加上@Before @AfterReturning @Around @After @AfterThrowing //通知类型
基本形式 @XXX ( value = " execution(语法) " )
通知类型详解
@Before 前置增强
@Before(value="execution( * xxx.xxx.example(..))")
@AfterReturning 后置增强
@AfterReturning(value="execution(*xxx.xxx.example(..))",returning="result") 切面方法中传入参数 (Object result)
@Around 环绕增强
@Around(value="execution(*xxx.xxx.example(..))")
切面方法中传入参数 (ProceedingJoinPoint joinPoint)
System.out.println("===前===");
Object object = joinPoint.proceed(); //执行切点的方法
System.out.println("===后===");
return object;
@AfterThrowing 异常抛出通知
@AfterThrowing(value="execution(*xxx.xxx.example(..))",throwing="ex")
可以在方法中传入参数 (Throwable ex) 获取到异常信息
@After 最终通知
@After(value="execution(*xxx.xxx.example(..))")
Spring事务管理
什么是事务?
事务指的是逻辑上一组操作,这组操作要么全部成功,要么全部失败.
事务特性
原子性
这一组操作不可分割,一起发生,或一起都不发生
一致性
事务前后数据的完整性要保持一致
比如银行转钱,不能小猪的钱扣掉了,而小熊的钱没增加,这样数据的完整性就被破环了
隔离性
多个用户并发的访问数据库时,各事务之间互不干扰
小猪修改数据库中一张表的信息,小熊同时也在修改这张表,这样两个事务之间就会产生影响,要将这两个事务隔离开来.
可以通过设置隔离级别来解决
DEFAULT
READ_UNCOMMITED 隔离级别最低,啥都解决不了
READ_COMMITED 解决了脏读
REPEATABLE_READ 解决了脏读,不可重复读
SERIALIZABLE 都解决了
脏读 读到还未提交的数据
不可重复读 读到了update后的数据,有可能多次读取同一数据的结果不一致
幻读 读到了insert后的数据,就是发现了之前读取不存在的数据
持久性
事务一旦提交,数据的修改是永久的
Spring接口介绍
spring在事务管理中提供的接口
Spring事务管理高层抽象的主要的三个接口
PlatformTransactionManager 事务管理器
spring为不同的持久层框架提供不同的接口实现
org.springframework.jdbc.datasource.DataSourceTransaction 使用Spring JDBC 或 iBatis
TransactionDefinition 事务定义信息(隔离, 传播, 超时, 只读)
隔离级别
DEFAULT
READ_UNCOMMITED
READ_COMMITEAD
REPREATABLE_READ
SERIALIZABLE
传播行为
(保证多个操作在同一个事务中)
PROPAGATION_REQUIRED 支持当前事务,不存在就创建一个
PROPAGATION_SUPPORT 支持当前事务,不存在就不用事务
PROPAGATION_MANDATORY 支持当前事务,不存在就抛出异常
(保证多个操作不在同一个事务中)
PROPAGATION_REQUIRES_NEW 挂起当前事务,创建新事务.不存在,创建新事务
PROPAGATION_NOT_SUPPORTED 挂起当前事务,不使用事务
PROPAGATION_NEVER 当前有事务,则报出异常
嵌套式事务
PROPAGATION_NESTED 如果A中存在事务,则在A事务执行完成后设置保存点,执行B操作,如果出现异常,则可以选择回滚到初始或者到保存点处
TransactionStatus 事务具体运行状态
事务管理方式
编程式的事务管理
使用XML配置声明式的事务管理(通过AOP实现)
前期准备
首先使用xxx.properties文件配置连接池
配置c3p0连接池
让DaoImp extends JdbcDaoSupport,就不需要在DaoImp中再写JdbcTemplate成员了,在配置文件bean中注入上面创建好的连接池对象,dataSource即可.
主要步骤
配置事务管理器 PlatformTransactionManager
配置事务增强(Advice)
AOP的配置
使用注解方式声明事务的管理
配置事务管理器
开启事务注解
在业务层添加注解
@Transactional
努力生活,自得其乐 —— 2019.03.26