设为首页 加入收藏

TOP

采用动态代理对事务进行封装 (二)
2014-11-24 12:00:05 来源: 作者: 【 】 浏览:102
Tags:采用 动态 代理 事务 进行 封装
xy.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;
}
}
原理:当我们在工厂中获取业务逻辑层对象的时候,我们获取的并不是目标对象,而是目标对象的代理,代理替我们管理事务的开启,提交,回滚,与关闭
在工厂中用动态代理包装业务逻辑对象
[java]
public synchronized Object GetServiceBean(Class c) {
if (ServiceMap.containsKey(c.getName())) {
return ServiceMap.get(c.getName());
}
Element beanEle = (Element) doc.selectSingleNode("//Service[@id=\""
+ c.getName() + "\"]");
String className = beanEle.attributeva lue("class");
// System.out.print(className);
Object serviceBean = null;
try {
serviceBean = Class.forName(className).newInstance();
//采用动态代理包装Service
TransactionHandler transactionHandler = new TransactionHandler();
//得到代理
serviceBean = transactionHandler.newProxyInstance(serviceBean);
ServiceMap.put(c.getName(), serviceBean);
} catch (Exception e) {
throw new RuntimeException();
}
return serviceBean;
}
public synchronized Object GetServiceBean(Class c) {
if (ServiceMap.containsKey(c.getName())) {
return ServiceMap.get(c.getName());
}
Element beanEle = (Element) doc.selectSingleNode("//Service[@id=\""
+ c.getName() + "\"]");
String className = beanEle.attributeva lue("class");
// System.out.print(className);
Object serviceBean = null;
try {
serviceBean = Class.forName(className).newInstance();
//采用动态代理包装Service
TransactionHandler transactionHandler = new TransactionHandler();
//得到代理www.2cto.comserviceBean = transactionHandler.newProxyInstance(serviceBean);
ServiceMap.put(c.getName(), serviceBean);
} catch (Exception e) {
throw new RuntimeException();
}
return serviceBean;
}
//获取的并不是目标对象,而是目标对象的代理
[java]
userManager = (UserManager) getBeanFactory().GetServiceBean(UserManager.class);
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Spring中Bean配置说明 下一篇Java面向对象理论基础

评论

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

·请问微信4.0版本xwec (2025-12-24 22:48:42)
·电脑NVIDIA的文件夹 (2025-12-24 22:48:40)
·如何看待微信新版本 (2025-12-24 22:48:37)
·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)