1, 前面一篇的文章介绍了TransactionTemplate的基本使用方法.

 同事在其基础上又做了一层封装,这样更贴合本公司的业务与规范.

2, 首先定义了两个接口:

  

ServiceTemplate ---->   对TransactionTemplate进行了封装
 public interface ServiceTemplate {

     /**
* <pre> 无事务模板执行业务处理
* 1. 异常捕获,及分类处理
* 2. 业务日志记录
* </pre>
*
* @param <T>
* @param clazz 返回对象
* @param action 业务操作回调的接口
* @return 服务返回对象
*/
<T> T executeWithoutTransaction(Class<? extends Result> clazz, ServiceCallback action); /**
* <pre> 支持本地事务模板执行业务处理
* 1. 本地事务封装
* 2. 异常捕获,及分类处理
* 3. 业务日志记录
* </pre>
*
* @param <T>
* @param clazz 返回对象
* @param action 业务操作回调的接口
* @return 服务返回对象
*/
<T> T execute(Class<? extends Result> clazz, ServiceCallback action); }

ServiceCallback  ---->  对TransactionCallBack进行了封装
 public interface ServiceCallback {
/**
* <pre> 校验
* 对于校验不通过,异常驱动返回
* </pre>
*/
void doLock(); /**
* <pre> 校验
* 对于校验不通过,异常驱动返回
* </pre>
*/
void check(); /**
* <pre> 执行业务逻辑
* </pre>
* @return
*/
Result executeService();
}
ServiceTemplate的具体实现如下:
 
 public class ServiceTemplateImpl implements ServiceTemplate {

     /** 事务模板 */
@Autowired
private TransactionTemplate transactionTemplate; @Override
public <T> T executeWithoutTransaction(Class<? extends Result> clazz,
ServiceCallback action) {
Result result = null;
try {
// 执行校验
action.check();
//锁操作
action.doLock(); // 执行处理逻辑
result = action.executeService();
//可以对结果进行初步校验TODO } catch (自定义异常 e) {
//打日志TODO
return (T) result; } catch (Throwable e2) {
//打日志TODO
return (T) result;
} return (T) result;
} @Override
@SuppressWarnings("unchecked")
public <T> T execute(final Class<? extends Result> clazz, final ServiceCallback action) {
T acResult = (T) transactionTemplate.execute(new TransactionCallback() {
/**
* @see org.springframework.transaction.support.TransactionCallback#doInTransaction(org.springframework.transaction.TransactionStatus)
*/
public Object doInTransaction(TransactionStatus status) { Result result = null; try { result = clazz.newInstance();
// 执行校验逻辑
action.check(); //锁操作
action.doLock(); // 执行处理逻辑
result = action.executeService();
// 返回值异常处理
if (result == null || !(result instanceof BaseResult)) {
throw new 自定义异常;
} } catch (自定义异常 e) {
// 业务异常捕获, 回滚, 打日志TODO status.setRollbackOnly(); return result;
} catch (Throwable e2) {
// 系统异常捕获, 回滚, 打日志TODO
status.setRollbackOnly();
return result;
}
return result;
}
});
return acResult;
} }

3, 在业务方法中使用ServiceTemplate, 通过构建ServiceCallBack匿名内部类的方式, 传递具体的业务代码:

  public Result update(final BaseOrder baseOrder) {
return serviceTemplate.execute(BooleanResult.class, new ServiceCallback() {
@Override
public void doLock() {
//进行锁操作
} @Override
public void check() {
//进行校验
} @Override
public Result executeService() {
Result result = new Result();
//具体的业务代码
return result;
}
});
}

注意: 如果是不需要加事务的方法, 如查询 ,那么调用serviceTemplate的executeWithoutTransaction即可

												

TransactionTemplate编程式事务管理方式的进阶使用---自定义拓展模板类的更多相关文章

  1. Spring事务管理的另一种方式--TransactionTemplate编程式事务管理简单入门

    1, 一直以来, 在用Spring进行事物管理时, 只知道用声明式的策略, 即根据不同的数据源, 配置一个事物管理器(TransactionManager), 通过配置切面(PointCut)应用到相 ...

  2. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  3. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

  4. spring 编程式事务管理和声明式事务管理

    编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...

  5. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  6. 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

    Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...

  7. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

  8. 深入理解TransactionTemplate编程式事务

    Spring可以支持编程式事务和声明式事务. Spring提供的最原始的事务管理方式是基于TransactionDefinition.PlatformTransactionManager.Transa ...

  9. Spring编程式事务管理和声明式事务管理

    本来想写一篇随笔记一下呢,结果发现一篇文章写的很好了,已经没有再重复写的必要了. https://www.ibm.com/developerworks/cn/education/opensource/ ...

随机推荐

  1. 浏览器内核 网址分解 web服务器

    浏览器最核心的部分是渲染引擎(Rendering Engine),我们一般习惯称之为"浏览器内核",其负责解析网页语法(如标准通用标记语言的子集HTML.JavaScript)并渲 ...

  2. node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)

    第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  3. Spring boot 1: 使用IDEA创建Spring boot项目

    项目用到的环境: Windows 10 JDK8 IntelliJ IDEA 2017.1.3 Apache Tomcat 8 Maven 3.3.3 使用IDEA新建spring boot项目 新建 ...

  4. MySQL,Oracle,PostgreSQL 数据库web维护客户端管理工具

    TreeDMS数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL 等数据库进行维护管理操作. 功能包 ...

  5. Css3视频教程下载

    本套教程主要讲解了大量的CSS3新功能,包括: 边框.圆角.背景.渐变.阴影.文本特效.2D/3D转换.过渡.动画.伪类元素的使用等,同时伴随了大量的实例制作,比如CSS3实现红心的制作,火焰字.多彩 ...

  6. 关于ZendStudio 10.5的破解 包括mac

    一. 下载ZendStudio 10.5 首先下载ZendStudio 10.5 我使用的是mac版 下载地址是: http://downloads.zend.com/studio-eclipse/1 ...

  7. 【LeetCode】125. Valid Palindrome

    题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...

  8. Akka(11): 分布式运算:集群-均衡负载

    在上篇讨论里我们主要介绍了Akka-Cluster的基本原理.同时我们也确认了几个使用Akka-Cluster的重点:首先,Akka-Cluster集群构建与Actor编程没有直接的关联.集群构建是A ...

  9. Ext 创建workspace package

    Ext 创建workspace package Package ExtJs Project 1. 创建工作区间文件目录 md wpt 2. 进入目录 cd wpt 3. 创建 创建工作区间 sench ...

  10. C++ 派生类到基类转换的可访问性

    今天看c++ primer关于派生类到基类转换的可访问性,看的很晕,看了下面的文章恍然大悟: http://www.2cto.com/kf/201403/283389.html C++ primer第 ...