Java事务(四) - 使用模板模式改造事务处理

一. 前言:

上一篇博文中, 我们使用TransactionManager和ThreadLocal完成线程安全的事务管理,不知大家有没有发现,AccountService代码充斥着很多事务处理的代码,其实这些代码在很多方法里面都是重复出现,我们可以使用Template模式进行优化。

二. 实现:

1. 写一个模板类:TransactionTemplate

/**
 * 模板类
 */
public abstract class TransactionTemplate {

	public void doJobInTransaction() throws SQLException {
		try {
			// 开启事务
			TransactionManager.beginTransaction();

			// 执行业务方法
			this.doJob();

			// 提交事务
			TransactionManager.commit();
		} catch (Exception e) {
			// 出错了, 回滚事务
			TransactionManager.rollback();
		} finally {
			// 关闭连接
			TransactionManager.close();
		}
	}

	protected abstract void doJob() throws Exception;
}

在TransactionTemplate类中定义一个doJobInTransaction方法,在该方法中首先使用TransactionManager开始事务,

然后调用doJob方法完成业务功能,doJob方法为抽象方法,完成业务功能的子类应该实现该方法,

最后,根据doJob方法执行是否成功决定commit事务或是rollback事务。

2. 改造业务处理类AccountService

/**
 * 业务逻辑层
 */
public class AccountService {

	public void transfer(final Account out, final Account in, final int money) throws SQLException {

		new TransactionTemplate() {
			@Override
			protected void doJob() throws Exception {
				// 查询两个账户
				AccountDAO accountDAO = new AccountDAO();
				Account outAccount = accountDAO.findAccountById(out.getId());
				Account inAccount = accountDAO.findAccountById(in.getId());

				// 转账 - 修改原账户金额
				outAccount.setMoney(outAccount.getMoney() - money);
				inAccount.setMoney(inAccount.getMoney() + money);

				// 更新账户金额
				accountDAO.update(outAccount);
				accountDAO.update(inAccount);
			}
		}.doJobInTransaction();

	}
}

在AccountService的transfer方法中,我们创建了一个匿名的TtransactionTemplate类,并且实现了doJob方法(doJob方法中两次调用DAO完成业务操作),然后调用调用TransactionTemplate的doJobInTransaction方法。

doJobInTransaction内部帮我们调用doJob并实现事务控制

时间: 2024-10-09 21:58:06

Java事务(四) - 使用模板模式改造事务处理的相关文章

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类图 2.2   优点 1)封装性良好,代码结构清晰 2)可拓展性高,只需修改一下工厂方法或拓展一个工厂类 3)屏蔽产品类,调用者不需要关心产品类的变化 4)高度解耦,高层模块只需知道产品抽象类,无需关注实现 2.3   缺点 代码复杂度增加 3     .应用拓展 3.1   应用场景 1)    

Java设计模式—单例模式和模板模式

1.单例模式方法:类构造方法私有的,类里面有个静态类对象用来保存这个类对象,并且这个类提供获取该类对象的静态方法. /** * 单例设计模式 * @author Admin * */ public class Design1 { private String name; private static Design1 d; private Design1(String name){ this.name = name; } public static Design1 getDesign(){ if(

Java设计模式(四) Facade(门面)模式及Tomcat引申

基本概念 Facade的概念 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易使用. 我们需要以一种比原有方式更简单直接的办法与系统交互,对于讨论的复杂系统我们只有针对性地使用它的一个子集 因为Facade模式可以封装多个子系统,可以减少客户必须处理的对象的数量 要求一个子系统的外部与内部的通信必须通过一个统一的对象进行.也就是说Facade对象是外界对于子系统的唯一通道,可以用来整合内部杂乱无章的子系统,不管是否败絮其中,都能做到金玉其外 Faca

JAVA设计模式-模板模式

模板模式作用 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 主要解决:一些方法通用,却在每一个子类都重新写了这一方法. 何时使用:有一些通用的方法. 如何解决:将这些通用算法抽象出来. 关键代码:在抽象类实现,其他步骤在子类实现. 示例代码: Exam.java /** * @Classname Exam * @Description 考试抽象类 * @Created by xiangty */public abs

Java设计模式(七)策略模式 模板模式

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

Java设计模式之模板模式(Template )

前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板模式. 模板模式(Template ): 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模式中的角色 抽象

java模式:模板模式的简单理解

1.模板模式就是用虚类作为基类将几个要执行差不多操作中相同的部分提取出来,不同的部分各自实现! 2.下面给出简单栗子: 我要进行的操作是将大象和狐狸放入冰箱,放入大象和狐狸有相同的步骤:开冰箱和关冰箱,这个操作在基类中实现就好,而不同的在于具体操作部分: 一,大象太胖了,要测量并切片才能放入冰箱 二,狐狸太臭了,要洗干净并擦干 所以程序如下: 1.基类:BasicFridgeOperation.java package com.learn.templateMode; /** * Created

JAVA设计模式之模板模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模板方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作