简介
- 本文的三个案例是为了更好的理解 Spring AOP 的机制,以及复习数据库事务管理。具体的功能是实现数据库的转账操作,核心知识主要分为三部分:数据库的连接、事务管理、依赖注入和功能测试。
- 案例一:直接在业务层添加代码,来进行事务管理
- 数据库的管理问题:通过Connection工具类来实现
- 事务管理:通过 Transaction 工具类,在 Service 业务层中实现
- 依赖注入:通过 xml配置文件
- 测试:通过Junit测试
- 案例二:通过代理模式增强代码,来进行事务管理
- 数据库的管理问题:通过Connection工具类来实现
- 事务管理:通过 Transaction 工具类,在 BeanFactory 代理类中实现。(获取增强过的业务层接口)
- 依赖注入:通过 xml配置文件
- 测试:通过 Junit 测试
- 案例三:通过SpringAOP,来进行事务管理
- 数据库的管理问题:通过Connection工具类来实现
- 事务管理:完全通过 Transaction 工具类实现(AOP,高内聚)
- 依赖注入:通过 xml配置文件 + 注解
- 测试:通过 Spring Junit 测试
- 案例一:直接在业务层添加代码,来进行事务管理
项目环境
数据库代码
- 创建数据库spring,在数据库中创建 Account表。
1 | # 创建数据库 |
Maven依赖
1 | <dependencies> |
业务层实现事务
目录结构
src
main
java
cn.water
momain:用于存放实体类。
- Account.java(实体类)
dao:用于存放持久层的接口和实现类。(具体的CRUD操作代码)
- AccountDao.java(持久层接口)
- AccountDaoImp.java(持久层实现类)
service:用于存放业务层的接口和实现类。
- AccountService.java(业务层接口)
- AccountServiceImp.java(业务层接口)
utils:用于存放工具类
- ConnectionUtils.java(数据库连接工具类)
- TransactionManager.java(事务管理工具类)
resources:用于存放配置文件
Beans.xml(Spring配置文件)
test:用于测试。
- cn.water.test
- SpringTest.java(测试类)
- cn.water.test
实体类
- 封装数据库查询操作的结果集
Account.java
1 | package cn.water.domain; |
持久层
- 实现具体的数据库操作代码
AccountDao.java
1 | package cn.water.dao; |
AccountDaoImp.java
1 | package cn.water.dao; |
数据库连接工具类
- 获取当前线程上的Connection对象
ConnectionUtils.java
1 | package cn.water.utils; |
事务管理工具类
- 对当前线程上的 Connection对象 进行事务管理的具体方法
TransactionManager.java
1 | package cn.water.utils; |
业务层(TM)
- 直接调用事务管理工具类的方法,实现事务管理
AccountService.java
1 | package cn.water.service; |
AccountServiceImp.java
1 | package cn.water.service; |
配置文件
- ServiceImp(业务层)
- DaoImp
- DaoImp(持久层)
- QueryRunner
- QueryRunner(数据库操作类)
- DataSource
- TransactionManager(事务管理工具类)
- ConnectionUtils
- ConnectionUtils(数据库连接工具类)
- DataSource
- DataSource(数据库连接池)
Beans.xml
1 |
|
测试类
SpringTest.java
1 | package cn.water.test; |
代理类实现事务
目录结构
src
main
java
cn.water
momain:用于存放实体类。
- Account.java(实体类)
dao:用于存放持久层的接口和实现类。(具体的CRUD操作代码)
- AccountDao.java(持久层接口)
- AccountDaoImp.java(持久层实现类)
service:用于存放业务层的接口和实现类。
- AccountService.java(业务层接口)
- AccountServiceImp.java(业务层接口)
utils:用于存放工具类
- ConnectionUtils.java(数据库连接工具类)
- TransactionManager.java(事务管理工具类)
factory:用于存放工厂类
- BeanFactory.java(代理工厂类)
resources:用于存放配置文件
Beans.xml(Spring配置文件)
test:用于测试。
- cn.water.test
- SpringTest.java(测试类)
- cn.water.test
实体类(不变)
- 封装数据库查询操作的结果集
Account.java
1 | package cn.water.domain; |
持久层
- 实现具体的数据库操作代码
- 引入 ConnectionUtils ,获取 Connection对象,在调用QueryRunner类的方法时传入。
- 我们不难看出,QueryRunner类和Connection对象的关系:
- 一、向QueryRunner类传入DataSource对象;
- 二、调用QueryRunner类的方法时传入Connection对象。
- 我们不难看出,QueryRunner类和Connection对象的关系:
AccountDao.java
1 | package cn.water.dao; |
AccountDaoImp.java
1 | package cn.water.dao; |
数据库连接工具类(不变)
- 获取当前线程上的Connection对象(不变)
ConnectionUtils.java
1 | package cn.water.utils; |
事务管理工具类(不变)
- 对当前线程上的 Connection对象 进行事务管理的具体方法
TransactionManager.java
1 | package cn.water.utils; |
业务层
- 直接调用事务管理工具类的方法,实现事务管理
AccountService.java
1 | package cn.water.service; |
AccountServiceImp.java
1 | package cn.water.service; |
代理工厂类(TM)
- 代理模式:创建代理对象,并增强代码
- 工厂模式:返回一个代理对象。
ProxyFactory.java
1 | package cn.water.factory; |
配置文件
- ProxyService(代理类)
- BeanFactory(代理工厂类)
- ServiceImp
- TransactionManager
- ServiceImp(业务层)
- DaoImp
- DaoImp(持久层)
- QueryRunner
- ConnectionUtils
- QueryRunner(数据库操作类)
- ConnectionUtils 能够为 DaoImp 提供 Connection对象,因此不必再为 QueryRunner 提供 DataSource
- 但要转而为 DaoImp 提供 ConnectionUtils
- TransactionManager(事务管理工具类)
- ConnectionUtils
- ConnectionUtils(数据库连接工具类)
- DataSource
- DataSource(数据库连接池)
Beans.xml
1 |
|
测试类
- Spring框架整合junit
SpringTest.java
1 | package cn.water.test; |
通知类实现事务(AOP)
目录结构
src
main
- java
- cn.water
- dao:用于存放持久层的接口和实现类。(具体的CRUD操作代码)
- AccountDao.java(持久层接口)
- AccountDaoImp.java(持久层实现类)
- momain:用于存放实体类。
- Account.java(实体类)
- service:用于存放业务层的接口和实现类。
- AccountService.java(业务层接口)
- AccountServiceImp.java(业务层接口)
- utils:用于存放工具类
- ConnectionUtils.java(数据库连接工具类)
- TransactionManager.java(事务管理工具类)
- dao:用于存放持久层的接口和实现类。(具体的CRUD操作代码)
- cn.water
- resources:用于存放配置文件
- Beans.xml(Spring配置文件)
- java
test:用于测试。
- cn.water.test
- SpringTest.java(测试类)
- cn.water.test
实体类(不变)
- 封装数据库查询操作的结果集
Account.java
1 | package cn.water.domain; |
持久层
- 实现具体的数据库操作代码
AccountDao.java
1 | package cn.water.dao; |
AccountDaoImp.java
1 | package cn.water.dao; |
数据库连接工具类(不变)
- 获取当前线程上的Connection对象
ConnectionUtils.java
1 | package cn.water.utils; |
事务管理工具类(TM)
- 使用Spring框架的AOP机制,进行事务管理
TransactionManager.java
1 | package cn.water.utils; |
业务层
- 直接调用事务管理工具类的方法,实现事务管理
AccountService.java
1 | package cn.water.service; |
AccountServiceImp.java
1 | package cn.water.service; |
配置文件
- QueryRunner(数据库操作类)
- DataSource(数据库连接池)
- 开启Spring注解扫描
- 开启SpringAOP注解支持
Beans.xml
1 |
|
测试类
SpringTest.java
1 | package cn.water.test; |