import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
public class TransactionHandler implements InvocationHandler {
private Object targetObject;
public Object createProxyObject(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Connection conn = null;
Object retValue = null;
try {
conn = ConnectionManager.getConnection();
if (method.getName().startsWith("add") ||
method.getName().startsWith("delete") ||
method.getName().startsWith("modify")) {
System.out.println("begin transaction");
//开启事务
conn.setAutoCommit(false);
}
//调用目标对象上的业务逻辑方法
retValue = method.invoke(this.targetObject, args);
if (!conn.getAutoCommit()) {
System.out.println("commit transaction");
//提交事务
conn.commit();
}
// }catch(AppException e) {
// if (!conn.getAutoCommit()) {
// System.out.println("rollback transaction");
// //回滚事务
// conn.rollback();
// }
// throw e;
}catch(Exception e) {
e.printStackTrace();
if (!conn.getAutoCommit()) {
System.out.println("rollback transaction");
//回滚事务
conn.rollback();
}
if (e instanceof InvocationTargetException) {
InvocationTargetException ite = (InvocationTargetException)e;
throw ite.getTargetException();
}
throw new AppException("操作错误!");
}finally {
conn.setAutoCommit(true);
ConnectionManager.closeConnection();
}
return retValue;
}
}
分享到:
相关推荐
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
此外,Spring AOP的代理机制(如JDK动态代理或CGLIB代理)在声明式事务管理中的作用也是源码学习的重要部分。 至于“工具”,可能是指一些辅助工具或技术,如IDEA中的debug工具,可以帮助开发者在调试过程中观察...
- **JDK动态代理**:在没有接口的情况下,Spring会创建一个实现了目标类所有接口的代理对象,然后在代理对象的方法调用前后插入事务处理代码。 - **CGLIB代理**:如果目标类实现了接口,Spring默认使用JDK动态代理...
在Spring中,AOP通过动态代理实现,可以是JDK动态代理或CGLIB动态代理,具体取决于目标对象是否实现了接口。对于声明式事务管理,Spring推荐使用基于接口的代理,因为这种方式更高效且更易于维护。 接下来,我们来...
主要有两种代理方式:基于接口的JDK动态代理和基于类的CGLIB代理。 接下来,我们将详细探讨五种事务管理配置方式: ### 第一种:每个Bean都有一个代理 在这种方式中,每个需要事务管理的Bean都会被一个事务代理...
3. **代理机制**:Spring通过代理机制实现事务控制,包括AOP(面向切面编程)代理和JDK动态代理。代理机制是决定事务策略的关键部分,它决定了事务如何在方法调用间传播。 接下来,我们将详述Spring配置事务的五种...
- **适用场景**:适合对事务有特殊需求的应用程序,例如需要在运行时动态调整事务配置。 3. **第四种方法:编程式事务管理**:通过手动编写代码来控制事务的开始、提交和回滚。适用于事务管理较为复杂的场景。 - ...
基于 node-spdy 和随机其他奇特事物的 Neocities 缓存代理服务器的开始。 repo 中的证书是自签名的,例如 example.org,NICE TRY DADE MURPHY。 我们开始推动 Nginx 超越它的能力,所以作为一个选项开始变得更有...
该软件允许数字角色(即代理)自动对其感知到的事物做出反应,无需编程技能即可操作。它是一款全方位的产品,包含了一系列强大的功能模块,如骨骼设计、运动混合、刚体动力学、布料模拟等,并支持基于优化的...
22. vary:变化,改变 - 描述事物的多样性或动态性。 23. vanish:消灭,不见 - 表示消失或无法找到。 24. swallow:吞下,咽下 - 常用于描述吃喝动作。 25. suspicion:怀疑,疑心 - 对某事持有疑虑的状态。 26. ...
- **代理模式**:协议常用于实现代理设计模式,让对象间进行通信。 6. **Foundation框架** Foundation框架是Objective-C的基础,提供了诸如字符串、数组、字典等基本数据结构,以及事件处理、线程管理等功能。 7...
2. 人力资源管理:古语“流水不腐,户枢不蠹”强调事物需要保持动态,对应在人力资源管理中,岗位轮换是一种体现这一理念的方法,因为它能促进员工的全面发展,避免工作僵化和技能单一。 3. 团体健康保险:团体健康...
云原生高性能边缘/中间/服务代理 - Protocol Buffers - Google 的数据交换格式 - 新的 Windows 终端和原始的 Windows 控制台主机 - 都在同一个地方! CSS —— :popcorn: 一个跨浏览器的 CSS 动画库。 像一件简单的...
I-DID中的主体不仅对环境的物理状态,而且对其他事物的模型也保持信念。 因此,随着时间的流逝,归因于其他代理的模型的指数增长使求解I-DID遭受损失。 以前解决I-ID的方法旨在通过比较候选模型的全部或部分策略树...
该项目是通过引导的。 您将在下面找到一些有关如何执行常见任务的信息。 您可以在找到本指南的最新版本。 目录 自动格式化代码 更改页面<title> 安装依赖项 ... 在服务器上生成动态<met
- Java动态代理的相关资料 **2.6 软件工程基础** - **定义**: 软件开发的整个生命周期。 - **内容要点**: - 软件开发流程 - 软件开发规范 - 界面设计规范 - 软件项目管理 - **学习资源**: - UML官方网站提供...
- **动态类型**:Objective-C支持动态类型,可以在运行时确定对象的类型。 3. **命名规则**:Objective-C遵循特定的命名约定,如首字母大写的类名和下划线分隔的属性名,这有助于代码的可读性。 4. **消息传递**...
流量监控,流量监控通常是负载均衡器或反向代理服务器的职责。 28. 微服务挑战:微服务架构面临的主要挑战包括服务间的通信复杂性、分布式事务管理和服务发现等。 - 问题:“以下哪些是微服务面临的挑战?”答案是...
在这个过程中,公司追求的是一种动态平衡,即在无序和有序之间找到最佳状态,使各部门之间相互支持、互相补充,形成强大的组织合力。 【代理商公司体系化建设的基本架构】 1. 销售体系:销售是代理商公司的核心...