Spring AOP的应用配置
1、Spring JdbcTemplate
在spring中为了更加方便的操作JDBC,在JDBC的基础之上定义了一个抽象层,此设计的目的是为不同类型的JDBC操作提供模板方法,每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务,通过这种方式,可以尽可能保留灵活性,将数据库存取的工作量讲到最低。
1、配置并测试数据源
pom.xml
1 |
|
dbconfig.properties
1 | root123 = |
applicationContext.xml
1 |
|
MyTest.java
1 | import com.alibaba.druid.pool.DruidDataSource; |
2、给spring容器添加JdbcTemplate
spring容器提供了一个JdbcTemplate类,用来方便操作数据库。
1、添加pom依赖
pom.xml
1 | <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --> |
jdbcTemplate.xml
1 |
|
MyTest.java
1 | import com.alibaba.druid.pool.DruidDataSource; |
3、插入数据
MyTest.java
1 | import com.alibaba.druid.pool.DruidDataSource; |
4、批量插入数据
MyTest.java
1 | import com.alibaba.druid.pool.DruidDataSource; |
5、查询某个值,并以对象的方式返回
MyTest.java
1 | import com.oi.bean.Emp; |
6、查询返回集合对象
MyTest.java
1 | import com.oi.bean.Emp; |
7、返回组合函数的值
MyTest.java
1 | import com.oi.bean.Emp; |
8、使用具备具名函数的JdbcTemplate
jdbcTemplate.xml
1 |
|
MyTest.java
1 | import com.oi.bean.Emp; |
9、整合EmpDao
jdbcTemplate.xml
1 | <context:component-scan base-package="com.oi"></context:component-scan> |
EmpDao.java
1 | package com.oi.dao; |
MyTest.java
1 | import com.oi.bean.Emp; |
2、声明式事务
1、环境准备
tx.sql
1 | /* |
BookDao.java
1 | package com.oi.dao; |
BookService.java
1 | package com.oi.service; |
MyTest.java
1 | import com.oi.service.BookService; |
总结:在事务控制方面,主要有两个分类:
编程式事务:在代码中直接加入处理事务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法
声明式事务:在方法的外部添加注解或者直接在配置文件中定义,将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。spring的AOP恰好可以完成此功能:事务管理代码的固定模式作为一种横切关注点,通过AOP方法模块化,进而实现声明式事务。
2、声明式事务的简单配置
Spring从不同的事务管理API中抽象出了一整套事务管理机制,让事务管理代码从特定的事务技术中独立出来。开发人员通过配置的方式进行事务管理,而不必了解其底层是如何实现的。
Spring的核心事务管理抽象是PlatformTransactionManager。它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务管理策略(编程式或声明式),事务管理器都是必须的。
事务管理器可以以普通的bean的形式声明在Spring IOC容器中。下图是spring提供的事务管理器
![事务管理器](Spring AOP应用之——声明式事务/事务管理器.png)
1、在配置文件中添加事务管理器
jdbcTemplate.xml
1 |
|
BookService.java
1 | package com.oi.service; |
3、事务配置的属性
isolation:设置事务的隔离级别
propagation:事务的传播行为
noRollbackFor:那些异常事务可以不回滚
noRollbackForClassName:填写的参数是全类名
rollbackFor:哪些异常事务需要回滚
rollbackForClassName:填写的参数是全类名
readOnly:设置事务是否为只读事务
timeout:事务超出指定执行时长后自动终止并回滚,单位是秒
4、测试超时属性
BookService.java
1 | package com.oi.service; |
5、设置事务只读
如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;
如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持。
对于只读查询,可以指定事务类型为readonly,即只读事务。由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段
BookService.java
1 | package com.oi.service; |
6、设置哪些异常不回滚
注意:运行时异常默认回滚,编译时异常默认不回滚
BookService.java
1 | package com.oi.service; |
7、设置哪些异常回滚
BookService.java
1 | package com.oi.service; |
8、设置隔离级别
隔离级别没有接触的同学可以看我之前的事务视频,里面有详细讲解,此处不再赘述。
BookService.java
1 | package com.oi.service; |
9、事务的传播特性
事务的传播特性指的是当一个事务方法被
+另一个事务方法调用时,这个事务方法应该如何进行?
spring的事务传播行为一共有7种:
![传播特性](Spring AOP应用之——声明式事务/传播特性.jpg)
10、测试事务的传播特性
BookDao.java
1 | package com.oi.dao; |
BookService.java
1 | package com.oi.service; |
MulService.java
1 | package com.oi.service; |
MyTest.java
1 | import com.oi.service.MulService; |
通过上图的结果发现,如果设置的传播特性是Required,那么所有的事务都会统一成一个事务,一旦发生错误,所有的数据都要进行回滚。
BookService.java
1 | package com.oi.service; |
通过修改checkout方法的传播特性为Required_new,发现价格进行了回滚,而其他的数据没有进行回滚。
BookService.java
1 | package com.oi.service; |
MulService.java
1 | package com.oi.service; |
将bookservice方法的传播行为为Required,并且将报错设置在MulService中,发现会都进行回滚。
BookService.java
1 | package com.oi.service; |
MulService.java
1 | package com.oi.service; |
将bookservice方法的传播行为为Requires_new,并且将报错设置在MulService中,发现都不会进行回滚。
BookService.java
1 | package com.oi.service; |
如果在bookservice执行的话,会发现刚刚的效果就没有了,原因是外层调用的时候使用的AOP,但是本类方法自己的调用就是最最普通的调用,就是同一个事务。
总结:
1 | 1、事务传播级别是REQUIRED,当checkout()被调用时(假定被另一类中commit()调用),如果checkout()中的代码抛出异常,即便被捕获,commit()中的其他代码都会roll back |
3、基于xml的事务配置
jdbcTemplate.xml
1 |
|