基于Spring框架的银行转账业务,通过XML配置方式实现事务管理
银行转账业务开发
项目概述
本项目是一个基于Spring框架的银行转账业务,主要演示了Spring AOP和声明式事务的使用。系统通过XML配置方式实现事务管理,确保转账操作的原子性、一致性、隔离性和持久性。
技术栈
- Spring 5.3.2
- Spring AOP
- Spring JDBC
- Spring事务管理
- MySQL 8.0
- Druid连接池
- Maven 3.x
- Java 15
项目结构
transfer-spring-aop-xml-tx/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── weh/ │ │ │ ├── dao/ │ │ │ │ ├── AccountDao.java # 账户数据访问接口 │ │ │ │ └── impl/ │ │ │ │ └── JdbcAccountDaoImpl.java # 账户数据访问实现 │ │ │ ├── pojo/ │ │ │ │ ├── Account.java # 账户实体类 │ │ │ │ └── Result.java # 响应结果类 │ │ │ ├── service/ │ │ │ │ ├── TransferService.java # 转账服务接口 │ │ │ │ └── impl/ │ │ │ │ └── TransferServiceImpl.java # 转账服务实现 │ │ │ ├── servlet/ │ │ │ │ └── TransferServlet.java # 转账Servlet │ │ │ └── utils/ │ │ │ └── JsonUtils.java # JSON工具类 │ │ ├── resources/ │ │ │ ├── applicationContext.xml # Spring配置文件 │ │ │ └── jdbc.properties # 数据库配置 │ │ └── webapp/ │ │ ├── WEB-INF/ │ │ │ └── web.xml # Web配置 │ │ ├── js/ │ │ │ └── jquery-3.4.1.min.js # jQuery库 │ │ └── index.html # 前端页面 │ └── test/ │ └── java/ │ └── IOCTest.java # 测试类 ├── account.sql # 数据库初始化脚本 ├── pom.xml # Maven配置 └── DEVELOPMENT.md # 开发文档核心功能
1. 转账功能
实现类:TransferServiceImpl.java
核心方法:
transfer(String fromCardNo, String toCardNo, int money):实现账户间的转账操作
事务管理:
- 通过Spring XML配置的声明式事务管理,确保转账操作的原子性
- 当转账过程中出现异常时,事务会自动回滚
2. 账户数据访问
实现类:JdbcAccountDaoImpl.java
核心方法:
queryAccountByCardNo(String cardNo):根据卡号查询账户信息updateAccountByCardNo(Account account):更新账户信息
技术实现:
- 使用Spring JDBC的JdbcTemplate进行数据库操作
- 依赖注入方式获取JdbcTemplate实例
转账业务时序图
下面是银行转账业务的时序图,展示了从前端发起请求到后端处理的完整流程,包括事务管理的处理过程。
时序图说明
请求发起 :前端页面通过AJAX向TransferServlet发送转账请求,包含转出卡号、转入卡号和转账金额。
请求处理 :TransferServlet接收请求,解析参数,然后调用TransferService的transfer方法。
事务开始 :Spring事务管理器开始一个新的事务。
账户查询 :TransferService调用AccountDao查询转出账户和转入账户的信息。
余额计算 :根据转账金额计算两个账户的新余额。
账户更新 :
- 先更新转入账户的余额
- 然后更新转出账户的余额
事务处理 :
- 如果过程中出现异常(如代码中的 1/0 ),事务会回滚,确保数据一致性
- 如果正常执行,事务会提交,完成转账操作
响应返回 :Servlet将处理结果返回给前端页面。
配置说明
1. Spring配置 (applicationContext.xml)
主要配置项:
- 组件扫描:
context:component-scan - 外部属性文件引入:
context:property-placeholder - 数据源配置:Druid连接池
- JdbcTemplate配置
- 事务管理器配置:
DataSourceTransactionManager - 事务通知配置:
tx:advice - AOP配置:
aop:config,定义切入点和通知
2. 数据库配置 (jdbc.properties)
配置项:
- 数据库驱动:
jdbc.driver - 数据库URL:
jdbc.url - 数据库用户名:
jdbc.username - 数据库密码:
jdbc.password
事务管理
事务配置
在applicationContext.xml中配置了声明式事务:
- 事务管理器:
DataSourceTransactionManager - 事务通知:
tx:advice,定义了事务属性 - AOP配置:将事务通知应用到
TransferServiceImpl的所有方法
事务属性
- 默认事务行为:
read-only="false" propagation="REQUIRED" isolation="DEFAULT" timeout="-1" - 查询方法事务行为:
read-only="true" propagation="SUPPORTS"
前端界面
页面:index.html
功能:
- 提供转账表单,包括转出卡号、转入卡号和转账金额
- 通过AJAX发送转账请求
- 显示转账结果
测试方法
1. 数据库初始化
执行account.sql脚本创建账户表并插入测试数据:
CREATETABLEaccount(idINTPRIMARYKEYAUTO_INCREMENT,cardNoVARCHAR(20)UNIQUE,nameVARCHAR(50),moneyINT);INSERTINTOaccount(cardNo,name,money)VALUES('6214541011001','张三',10000),('6214541011002','李四',10000);2. 启动项目
使用Maven Tomcat插件启动项目:
mvn tomcat7:run3. 测试转账
- 访问
http://localhost:8080/ - 输入转出卡号、转入卡号和转账金额
- 点击"转账"按钮
- 查看转账结果
故障模拟与测试
在TransferServiceImpl.transfer()方法中,故意插入了一个异常:
inta=(1/0);// 这里抛异常,进行模拟业务逻辑此异常用于测试事务回滚功能:
- 当执行到此处时,会抛出
ArithmeticException - Spring会自动回滚事务,确保转出账户的钱不会减少,转入账户的钱也不会增加
扩展与优化
1. 异常处理优化
- 建议添加全局异常处理机制
- 对业务异常进行分类处理,提供更友好的错误提示
2. 日志记录
- 建议添加日志记录,便于系统监控和问题排查
- 可使用SLF4J + Logback或Log4j
3. 安全性增强
- 添加输入验证,防止恶意输入
- 考虑添加用户认证和授权机制
- 对敏感操作进行审计日志记录
4. 性能优化
- 考虑使用连接池的合理配置
- 对频繁查询的操作添加缓存
- 优化数据库查询语句
部署说明
1. 环境要求
- JDK 15+
- Maven 3.x+
- MySQL 8.0+
- Tomcat 7.0+
2. 构建与部署
- 克隆项目代码
- 修改
jdbc.properties中的数据库配置 - 执行
mvn clean package构建项目 - 将生成的
transfer-1.0-SNAPSHOT.war部署到Tomcat - 启动Tomcat服务器
- 访问应用
总结
本项目演示了如何使用Spring AOP和声明式事务管理实现一个简单的转账系统。通过XML配置方式,我们实现了:
- 依赖注入(DI)
- 面向切面编程(AOP)
- 声明式事务管理
- 数据库操作
