`
CHEEN
  • 浏览: 135784 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

动态代理结合事物的应用

    博客分类:
  • Java
阅读更多
在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;
	}

}


0
0
分享到:
评论

相关推荐

    spirn的事物配置详解与webservices案例

    1. Spring事物配置详解: 在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式来管理事务。声明式事务管理通过在XML配置文件或注解中定义事务边界,使得事务处理更加简洁。例如,可以使用...

    spring-控制事物

    此外,Spring AOP的代理机制(如JDK动态代理或CGLIB代理)在声明式事务管理中的作用也是源码学习的重要部分。 至于“工具”,可能是指一些辅助工具或技术,如IDEA中的debug工具,可以帮助开发者在调试过程中观察...

    2024辽宁省数学建模简介及应用实例及实例分析.txt

    在 Web 开发领域,Nginx 被广泛应用于负载均衡、反向代理以及缓存等方面。本实例将通过搭建一个多站点的 Nginx 服务器环境,展示其在提高网站访问速度、增强安全性等方面的强大功能。 ### 结语 通过对上述几个具体...

    Spring事物配置的五种模式

    本文将详细介绍五种常见的Spring事务配置模式,并结合具体的配置示例进行说明。 #### 一、每个Bean都有一个代理 这种方式是最直接也是最简单的配置方法。它通过为每个需要事务支持的Bean创建一个代理来实现。这种...

    依人工智能相关产品设计观点探讨大数据应用研究.pdf

    文章还强调了在进行人工智能相关产品设计时需要结合大数据应用,这样的结合能够显著提升人工智能相关产品的设计开发绩效。大数据应用在产品设计中的价值在于能够提供丰富的用户行为数据,使得产品设计师能够根据数据...

    基于人工智能技术的输电线路继电保护系统的应用研究.pdf

    专家系统是最早发展且应用广泛的人工智能技术之一,它能够结合专家知识和经验来处理复杂的实际问题。在电力系统继电保护中,专家系统通常采用不同的知识表示方法,如谓词逻辑、产生规则、过程式知识、框架表示法、...

    spring事物的五种配制方法

    - **适用场景**:适合对事务有特殊需求的应用程序,例如需要在运行时动态调整事务配置。 3. **第四种方法:编程式事务管理**:通过手动编写代码来控制事务的开始、提交和回滚。适用于事务管理较为复杂的场景。 - ...

    springCloud-rabbitmq分布事物实现.zip

    首先,RabbitMQ是一个开源的消息代理和队列服务器,它允许应用程序之间异步通信。在分布式事务中,RabbitMQ作为消息中间件,可以用于协调多个服务之间的操作,保证所有操作要么全部成功,要么全部失败,从而实现ACID...

    spring事物管理

    在示例代码中,`是一个事务代理工厂,它创建了一个共享的事务代理,所有与`transactionBase`关联的bean(例如`userDaoProxy`)都将自动进行事务管理。`transactionAttributes`属性定义了事务的传播行为,如`...

    spring amqp rabbit 消息确认及外部事物

    RabbitMQ是世界上最受欢迎的消息代理,它基于Advanced Message Queuing Protocol (AMQP)标准,允许应用程序之间异步通信。在Spring中集成RabbitMQ可以实现高效、可靠的消息传递。本篇文章将深入探讨“Spring AMQP与...

    Spring中的声明式事物

    - AOP是实现声明式事务的基础,它通过代理模式在方法调用前后插入事务管理代码。 - 事务增强器(如`TransactionInterceptor`)根据配置的事务属性决定是否开始、提交、回滚事务。 通过理解并熟练掌握这些概念,...

    2019年十大战略技术趋势.pdf

    另一方面,自主虚拟事物,如虚拟助理和独立代理,正在改善跨部门和地点的通信,提供个性化的协作体验。到2022年,超过50%的工业4.0生态系统参与者将使用这些工具进行更自然的互动。虚拟助理可以根据用户的指令或行为...

    Cocoa Programming Developer's Handbook

    - **Delegate 模式**:通过定义协议并指定代理对象,实现了对象之间的解耦和通信。 - **通知机制**:利用 NSNotificationCenter 进行对象间的异步通信,提高了应用程序的灵活性。 #### 五、Cocoa 的开发工具 - **...

    Head First Design Patterns(All in one).pdf

    - 讨论了代理模式在远程代理、虚拟代理等场景中的应用。 12. **第十二章:模式中的模式:复合模式** - 解释了如何将多个设计模式结合使用以解决更复杂的问题。 - 通过例子展示了复合模式的实际应用。 13. **第...

    2019年BJ-《麦播》APP应用商业计划书.doc

    - 优势:独特的平台定位,结合了娱乐与经纪功能,满足多元化需求。 - 劣势:作为新兴平台,品牌知名度和用户基础需要时间积累。 - 机会:移动互联网的快速发展和用户娱乐需求的升级。 - 威胁:竞争对手的激烈竞争,...

    忠县2018年事业编招聘考试真题及答案解析完整版(1).docx

    - 类似的推理模式可应用于其他领域,如魔术表演,如果魔术师的表演经常被揭穿,那么他可能不是一个出色的魔术师。 以上知识点涵盖了哲学、法律、心理学、社会学、逻辑推理等多个领域,反映了事业编招聘考试中可能...

    37岁裸辞创业变现15w,我应用的7个思考模型.pdf

    ### 37岁裸辞创业变现15w,我应用的7个思考模型 #### 一、现状简介 本文作者亚萨,一位37岁的创业者,曾在北京从事互联网产品工作8年,随后转战传统金融行业担任创新营销职位长达5年。2021年,他裸辞离开原有的...

    spring 事务(6中配置完全降解)

    `DefaultAdvisorAutoProxyCreator`是Spring AOP中用于自动创建代理的组件,它会寻找所有`Advisor`(包括事务增强`Advisor`),并将它们应用到相关的bean上。这样,我们可以通过定义`Pointcut`来决定哪些方法需要...

Global site tag (gtag.js) - Google Analytics