在jdk1.3中或更高版本中继承java.lang.reflect.InvocationHandler实现动态代理
package com.read.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import com.read.util.ConnectionFactory;
/**
* 动态代理处理类
* @author
*
*/
public class TransactionWrapper {
/**
* 装饰原始的业务代表对象,返回一个与业务代表对象有相同接口的代理对象
*/
public static Object decorate(Object delegate) {
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), new XAWrapperHandler(
delegate));
}
// 动态代理技术
static final class XAWrapperHandler implements InvocationHandler {
private final Object delegate;
XAWrapperHandler(Object delegate) {
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Connection conn = null;
Object retValue = null;
try {
conn = JdbcQueryManager.getConnection();
/** 如果方法名以‘add’,'delete','update'开头就启用事物 */
if (method.getName().startsWith("add")
|| method.getName().startsWith("delete")
|| method.getName().startsWith("update")) {
delegate.getClass().getMethod("setConn",Class.forName(Connection.class.getName())).invoke(delegate, new Object[]{conn});
conn.setAutoCommit(false);
System.out.println("开始事物.......");
}else if(method.getName().startsWith("find")){
//不启用事物
conn.setAutoCommit(true);
}else{
//不启用事物
conn.setAutoCommit(true);
}
// 调用目标对象上的业务逻辑方法
retValue = method.invoke(delegate, args);
if(!conn.getAutoCommit()){
// 提交事务
conn.commit();
System.out.println("提交事物........");
}
} catch (Exception e) {
e.printStackTrace();
if(!conn.getAutoCommit()){
conn.rollback();
System.out.println("出错了,回滚数据........");
}
throw new Exception("操作错误!");
} finally {
//将连接放入连接池中
ConnectionFactory.closeConnection(conn);
}
return retValue;
}
}
}
package com.read.proxy;
import java.sql.Connection;
import com.read.util.StrUtil;
/**
* 测试,该类必须实现@see : com.read.proxy.TestProxyInter
* @author 陈彪
*
*/
public class TestProxy implements TestProxyInter {
private ExecuteSQL exe = new ExecuteSQL();
private Connection conn;
public void setConn(Connection conn) {
this.conn = conn;
}
public void addMat() throws Exception {
try {
exe.setConn(conn);
exe.executeSql("insert into test(a) values(?)",new Object[]{StrUtil.replaceSql("1")});
exe.executeSql("insert into test(a) values(?)",new Object[]{StrUtil.replaceSql("2")});
exe.executeSql("insert into test(a) values(?)",new Object[]{StrUtil.replaceSql("3")});
exe.executeSql("insert into test(a) values(?)",new Object[]{StrUtil.replaceSql("4")});
//错误写法
exe.executeSql("insert into test(af) values(?)",new Object[]{StrUtil.replaceSql("5")});
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
public static void main(String []args){
TransactionWrapper in = new TransactionWrapper();
TestProxyInter s = (TestProxyInter)in.decorate(new TestProxy());
try {
s.addMat();
} catch (Exception e) {
e.printStackTrace();
}
}
public Connection getConn() {
return conn;
}
}
分享到:
相关推荐
1. Spring事物配置详解: 在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式来管理事务。声明式事务管理通过在XML配置文件或注解中定义事务边界,使得事务处理更加简洁。例如,可以使用...
此外,Spring AOP的代理机制(如JDK动态代理或CGLIB代理)在声明式事务管理中的作用也是源码学习的重要部分。 至于“工具”,可能是指一些辅助工具或技术,如IDEA中的debug工具,可以帮助开发者在调试过程中观察...
在 Web 开发领域,Nginx 被广泛应用于负载均衡、反向代理以及缓存等方面。本实例将通过搭建一个多站点的 Nginx 服务器环境,展示其在提高网站访问速度、增强安全性等方面的强大功能。 ### 结语 通过对上述几个具体...
本文将详细介绍五种常见的Spring事务配置模式,并结合具体的配置示例进行说明。 #### 一、每个Bean都有一个代理 这种方式是最直接也是最简单的配置方法。它通过为每个需要事务支持的Bean创建一个代理来实现。这种...
文章还强调了在进行人工智能相关产品设计时需要结合大数据应用,这样的结合能够显著提升人工智能相关产品的设计开发绩效。大数据应用在产品设计中的价值在于能够提供丰富的用户行为数据,使得产品设计师能够根据数据...
专家系统是最早发展且应用广泛的人工智能技术之一,它能够结合专家知识和经验来处理复杂的实际问题。在电力系统继电保护中,专家系统通常采用不同的知识表示方法,如谓词逻辑、产生规则、过程式知识、框架表示法、...
- **适用场景**:适合对事务有特殊需求的应用程序,例如需要在运行时动态调整事务配置。 3. **第四种方法:编程式事务管理**:通过手动编写代码来控制事务的开始、提交和回滚。适用于事务管理较为复杂的场景。 - ...
首先,RabbitMQ是一个开源的消息代理和队列服务器,它允许应用程序之间异步通信。在分布式事务中,RabbitMQ作为消息中间件,可以用于协调多个服务之间的操作,保证所有操作要么全部成功,要么全部失败,从而实现ACID...
在示例代码中,`是一个事务代理工厂,它创建了一个共享的事务代理,所有与`transactionBase`关联的bean(例如`userDaoProxy`)都将自动进行事务管理。`transactionAttributes`属性定义了事务的传播行为,如`...
RabbitMQ是世界上最受欢迎的消息代理,它基于Advanced Message Queuing Protocol (AMQP)标准,允许应用程序之间异步通信。在Spring中集成RabbitMQ可以实现高效、可靠的消息传递。本篇文章将深入探讨“Spring AMQP与...
- AOP是实现声明式事务的基础,它通过代理模式在方法调用前后插入事务管理代码。 - 事务增强器(如`TransactionInterceptor`)根据配置的事务属性决定是否开始、提交、回滚事务。 通过理解并熟练掌握这些概念,...
另一方面,自主虚拟事物,如虚拟助理和独立代理,正在改善跨部门和地点的通信,提供个性化的协作体验。到2022年,超过50%的工业4.0生态系统参与者将使用这些工具进行更自然的互动。虚拟助理可以根据用户的指令或行为...
- **Delegate 模式**:通过定义协议并指定代理对象,实现了对象之间的解耦和通信。 - **通知机制**:利用 NSNotificationCenter 进行对象间的异步通信,提高了应用程序的灵活性。 #### 五、Cocoa 的开发工具 - **...
- 讨论了代理模式在远程代理、虚拟代理等场景中的应用。 12. **第十二章:模式中的模式:复合模式** - 解释了如何将多个设计模式结合使用以解决更复杂的问题。 - 通过例子展示了复合模式的实际应用。 13. **第...
- 优势:独特的平台定位,结合了娱乐与经纪功能,满足多元化需求。 - 劣势:作为新兴平台,品牌知名度和用户基础需要时间积累。 - 机会:移动互联网的快速发展和用户娱乐需求的升级。 - 威胁:竞争对手的激烈竞争,...
- 类似的推理模式可应用于其他领域,如魔术表演,如果魔术师的表演经常被揭穿,那么他可能不是一个出色的魔术师。 以上知识点涵盖了哲学、法律、心理学、社会学、逻辑推理等多个领域,反映了事业编招聘考试中可能...
### 37岁裸辞创业变现15w,我应用的7个思考模型 #### 一、现状简介 本文作者亚萨,一位37岁的创业者,曾在北京从事互联网产品工作8年,随后转战传统金融行业担任创新营销职位长达5年。2021年,他裸辞离开原有的...
`DefaultAdvisorAutoProxyCreator`是Spring AOP中用于自动创建代理的组件,它会寻找所有`Advisor`(包括事务增强`Advisor`),并将它们应用到相关的bean上。这样,我们可以通过定义`Pointcut`来决定哪些方法需要...