设为首页 加入收藏

TOP

采用动态代理对事务进行封装 (一)
2014-11-24 12:00:05 来源: 作者: 【 】 浏览:100
Tags:采用 动态 代理 事务 进行 封装
如果采用三层架构的方式开发,在业务逻辑层不可避免的要手动操作事务,所以在业务逻辑层会出现很多与业务逻辑无关的:
Connection conn = ConnectionManage.GetConnection();
ConnectionManage.beginTransaction(conn); ConnectionManage.commitTransaction(conn);等等代码。
不仅不合理,而且是重复劳动, 程序开发的一个原则就是杜绝重复劳动,做到良好的封装。
这里,我们就采用动态代理对事务进行封装,使我们的业务逻辑层不再出现有关事务的代码。
[java]
package com.jialin.drp.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
/**
* 使用动态代理封装事务
* @author jialin
*
*/
public class TransactionHandler implements InvocationHandler {
private Object targetObject;
/**
* 获取目标类的代理
* @param targetObject
* @return
*/
public Object newProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
/**
* 代理方法,调用目标类方法前先调用该方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Connection conn = null;
Object ret = null;
try {
// 从ThreadLocal中取得Connection。ConnectionManage是对connection的封装
conn = ConnectionManage.GetConnection();
//如果是以add,del,modify开头的方法,则手动开启事务
if (method.getName().startsWith("add")
|| method.getName().startsWith("del")
|| method.getName().startsWith("modify")) {
// 手动控制事务提交
ConnectionManage.beginTransaction(conn);
}
// 调用目标对象的业务逻辑方法
ret = method.invoke(targetObject, args);
//如果事务为手动提交方式,则手动提交事务
if (!conn.getAutoCommit()) {
// 提交事务
ConnectionManage.commitTransaction(conn);
}
} catch (Exception e) {
//如果事务为手动提交方式,则手动回滚事务
if (!conn.getAutoCommit()) {
// 回滚事务
ConnectionManage.rollbackTransaction(conn);
}
e.printStackTrace();
if (e instanceof InvocationTargetException) {
InvocationTargetException ete = (InvocationTargetException) e;
throw ete.getTargetException();
}
throw new Exception("操作失败!");
} finally {
//关闭连接
ConnectionManage.closeConnection();
}
return ret;
}
}
package com.jialin.drp.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
/**
* 使用动态代理封装事务
* @author jialin
*
*/
public class TransactionHandler implements InvocationHandler {
private Object targetObject;
/**
* 获取目标类的代理
* @param targetObject
* @return
*/
public Object newProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Pro
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Spring中Bean配置说明 下一篇Java面向对象理论基础

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)
·索引堆及其优化 - 菜 (2025-12-24 20:18:50)
·Shell 中各种括号的 (2025-12-24 19:50:39)
·Shell 变量 - 菜鸟教 (2025-12-24 19:50:37)