Spring学习笔记
🦋🦋🦋
AOP增强,JdbcTemplate,事务
AOP增强
一. AOP增强简介
Spring使用增强类定义横切逻辑,同时由于Spring只支持方法连接点,增强类还包括在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,又包含部分连接点信息。

- 其中带Spring标志的是Spring定义的扩展增强接口,带aopalliance标志的是AOP联盟所定义的接口。
二. AOP增强类型
按照增加在目标类方法连接点的位置可以将增强划分为以下五类:
- 前置增强 (org.springframework.aop.BeforeAdvice) 表示在目标方法执行前来实施增强。
- 后置增强 (org.springframework.aop.AfterReturningAdvice) 表示在目标方法执行后来实施增强。
- 环绕增强 (org.aopalliance.intercept.MethodInterceptor) 表示在目标方法执行前后同时实施增强。
- 异常抛出增强 (org.springframework.aop.ThrowsAdvice) 表示在目标方法抛出异常后来实施增强。
- 引介增强 (org.springframework.aop.introductioninterceptor) 表示在目标类中添加一些新的方法和属性。
引介增强是一种特殊的增强。他可以在目标类中添加属性和方法,通过拦截定义一个接口,让目标代理实现这个接口。他的连接点是类级别的,而前面的几种则是方法级别的。 环绕增强是AOP联盟定义的接口,其他四种增强接口则是Spring定义的接口。
AOP增强:通过实现这些增强接口,在实现这些接口的方法当中定义横切逻辑,然后通过配置Spring的配置文件就可以完成将增强织入到目标方法当中了。
三.AOP增强实现
1). 前置增强
1 |
|
2). 后置返回增强
1 |
|
3). 环绕增强
1 |
|
4). 异常抛出增强
1 |
|
JdbcTemplate
一. 简介
1). 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
2). 作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
3). Spring的JdbcTemplate是一个小型的轻量级持久化层框架。
二. JdbcTemplate的使用
1). JdbcTemplate所需要的JAR包
1 | IOC容器所需要的JAR包 |
2). 存储连接数据库信息
1 | =oracle.jdbc.OracleDriver |
3). 数据库连接的配置文件
1 |
|
4). 增删改查测试方法
1 | public class TestJdbcTemplate { |
① 增删改
JdbcTemplate.update(String, Object...)
1 | //单条增删改 |
② 批量增删改
JdbcTemplate.batchUpdate(String, List<Object[]>)
Object[]封装了SQL语句每一次执行时所需要的参数
List集合封装了SQL语句多次执行时的所有参数
1 | //批量增删改 |
③ 查询单行
JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)
1 | //数据的查询 |
④ 查询多行
JdbcTemplate.query(String, RowMapper<Department>, Object...)
RowMapper对象依然可以使用BeanPropertyRowMapper
1 |
|
⑤ 查询单一值
JdbcTemplate.queryForObject(String, Class, Object...)
1 |
|
事务
一. 简介
事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行,保证了数据的完整性和一致性。
事务:一组业务操作ABCD,要么全部成功,要么全部不成功。
二. 特性:
1). ACID
原子性:整体
事务的原子性(不可再分)要求事务中的所有操作要么都执行,要么都不执行。
一致性:完成
所有数据都处于满足业务规则的一致性状态。如果一个事务在执行的过程中,其中某个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
隔离性:并发
每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。
持久性:结果
持久性原则要求事务执行完成后,对数据的修改永久的保存下来。
2). 隔离问题:
脏读:一个事务读到另一个事务没有提交的数据;
不可重复读:一个事务读到另一个事务已提交的数据(update)[读出的数据不一样];
虚读(幻读):一个事务读到另一个事务已提交的数据(insert)[读出的数据不一样];
3). 隔离级别:
读未提交read uncommitted:允许其他事务读取未提交的数据,存在3个问题;
读已提交read committed:只能读取其他食物已提交的数据,解决脏读,存在2个问题;
可重复读repeatable read:同一事务期间可重复读取多次相同的值(其他事务提交的也读不到),解决:脏读、不可重复读,存在1个问题;
串行化serializable:解决并发问题,性能弱,单事务;
三.Spring事务管理
1). 编程式事务管理
使用原生的JDBC API进行事务管理
[1]获取数据库连接Connection对象
[2]取消事务的自动提交
[3]执行操作
[4]正常完成操作时手动提交事务
[5]执行失败时回滚事务
[6]关闭相关资源
特点:
原生的JDBC API实现事务管理是所有事务管理方式的基石,同时也是最典型的编程式事务管理。编程式事务管理需要将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。会造成较大程度的代码冗余。
2). 声明式事务
事务管理代码的固定模式作为一种横切关注点,可以通过AOP方法模块化,进而借助Spring AOP框架实现声明式事务管理。
- Spring既支持编程式事务管理,也支持声明式的事务管理。
四. 事务管理器的主要实现
1). DataSourceTransactionManager:在应用程序中只需要处理一个数据源,而且通过JDBC存取。
2). JtaTransactionManager:在JavaEE应用服务器上用JTA(Java Transaction API)进行事务管理
3). HibernateTransactionManager:用Hibernate框架存取数据库
- 事务管理器可以在目标方法运行前后进行事务控制(事务切面);
五. 事务初步实现
1). 配置文件
1 |
|
2). 在方法上加事务控制
- 重要的用配置,不重要的用注解。
①注解@Transactional
1 |
|
②配置文件xml
1 |
|
3). 隔离级别
隔离级别解决并发问题的能力见下表
| 脏读 | 不可重复读 | 幻读 | Oracle | MySQL | |
|---|---|---|---|---|---|
| READ UNCOMMITTED | 有 | 有 | 有 | × | √ |
| READ COMMITTED | 无 | 有 | 有 | √ | √ |
| REPEATABLE READ | 无 | 无 | 有 | × | √(默认) |
| SERIALIZABLE | 无 | 无 | 无 | √ | √ |
1 | /** |
4). 传播行为
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。事务的传播行为可以由传播属性指定。

1 | (propagation=Propagation.REQUIRES_NEW) |
多个事务执行
1 |
|
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/43bf071f.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!