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. C#基础知识-XML介绍及基本操作(十)

    在讲了一系列的基础文档之后,现在开始讲一些实例.对于一些数据不是很大的程序,或者只是一些配置文件,需要本地存储的,完全可以使用XML代替数据库,因为只是去操作单个文件会比操作数据库要简单很多,在程序中 ...

  2. .Net Mvc Automated Migration 数据迁移

    1.打开程序包管理器控制台 PM> enable-migrations –EnableAutomaticMigration:$true 2.项目工程文件中会生成Migrations文件夹 3.找 ...

  3. Tomcat、JBOSS、WebSphere、WebLogic、Apache等技术概述

    Tomcat:应用也算非常广泛的web服务器,支持部分j2ee,免费,出自apache基金组织   JBoss:开源的应用服务器,比较受人喜爱,免费(文档要收费)   Weblogic:应该说算是业界 ...

  4. AI相关 TensorFlow -卷积神经网络 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  5. Kafka 源代码分析之LogSegment

    这里分析kafka LogSegment源代码 通过一步步分析LogManager,Log源代码之后就会发现,最终的log操作都在LogSegment上实现.LogSegment负责分片的读写恢复刷新 ...

  6. 【LeetCode】220. Contains Duplicate III

    题目: Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  7. 利用MUI滑动进行利息计算(移动端APP显示)

    在开发移动端的应用时,会用到很多的手势操作,比如滑动.长按等,为了方便开放者快速集成这些手势,mui内置了常用的手势事件,其中滑动应用是比较常见的应用操作,本篇文章将讲述如何利用滑动改变对应值进行计算 ...

  8. Python爬虫学习之爬美女图片

    最近看机器学习挺火的,然后,想要借助业余时间,来学习Python,希望能为来年找一份比较好的工作. 首先,学习得要有动力,动力,从哪里来呢?肯定是从日常需求之中来.我学Python看网上介绍.能通过P ...

  9. CentOS7 yum安装zabbix3.2.6

    前言: 本人小白,在一个多月前通过面试进入公司,在进入公司的第一天,老板把我叫到他办公室,坐下来慢慢喝茶,吹牛,给我吹他们以前做的软件,经营的产品,还装作一副什么都告诉我的样子,其实这都是套路,我早已 ...

  10. jmeter- Java-POST接口使用get与json格式传参

    在测试过程中发现各种接口传参形式,今天就来说说小编遇到的一种,接口请求方式为POST:URL传参以GET形式并携带JSON 可能这样诉说有不少同学不太理解. 如图: 上图所示就是一般get请求传参格式 ...