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

浅析“代理模式”实现spring事务管理

阅读更多
模拟用户调用:
package bean.parterdesign.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//RealSubject 是接口Subject 的实现类
		RealSubject rs = new RealSubject(); // 在这里指定被代理类
		InvocationHandler ds = new DynamicSubject(rs); // 初始化代理类
		
		//实现类的相关信息
		ClassLoader rsClassLoader = RealSubject.class.getClassLoader(); 
		Class[]  rsInterfaces = RealSubject.class.getInterfaces();
		
		//生成RealSubject 的代理类, 并执行
		Subject subject = (Subject) Proxy.newProxyInstance(	rsClassLoader,rsInterfaces, ds);
		subject.request();
		
		System.out.println("======动态代理类====" + subject.getClass().getName() );
		
		/*// 以下是分解步骤
		 * Class c =  Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces()) ;
		 * Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
		 * Subject subject =(Subject) ct.newInstance(new Object[]{ds});
		 */
		
		Class c =  Proxy.getProxyClass(rsClassLoader,rsInterfaces) ;
		System.out.println( c.getName() );
		System.out.println("===== 动态代理类实现的接口==" + c.getInterfaces()[0].getName() );
		
	}

}




RealSubject 的代码:
package bean.parterdesign.proxy;

public class RealSubject implements Subject {
	
	public RealSubject()  { 
	
	} 

	//提交数据更新操作
	public void request() { 
		System.out.println("UPDATE DATABASE From real subject."); 
	}
}


DynamicSubject(InvocationHandler接口的实现类) 的代码:
Proxy根据InvocationHandler接口的实现类中的内容生成最后供用户调用的Subject接口

//生成RealSubject 的代理类
Subject subject = (Subject) Proxy.newProxyInstance( rsClassLoader,rsInterfaces, ds);


package bean.parterdesign.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicSubject implements InvocationHandler {

	private Object sub; // sub 必须是一个接口的实现类
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//为啥要设置自动提交为false ?很多数据库驱动是自动提交的
		System.out.println("设置 Object sub 中的CONNECTION自动提交为false , connect before calling " + method);
		try {
			method.invoke(sub, args);
		} catch (Exception e) {
			System.out.println("发生异常时进行数据回滚 ,  " + method);
		}
		System.out.println("没有异常时,可以提交  after calling " + method);
		return null;
	}
	
	public DynamicSubject() {  

	}

	public DynamicSubject(Object obj) {
		sub = obj;
	}

}


--------------------------------------------------------------------
DynamicSubject 中我们可以模拟数据库操作;实现事务管理;

初级开发者会犯一个错误:直接从SPRING中配置的DATASOURCE中取得CONNECT数据库连接,这样会导致事务失效;
因为你取得的连接的AUTOCOMMIT 是TRUE ;这样事务就没法交给SPRING进行管理啦。

用代理的作用其实就是控制CONNECT数据库连接,通过代理我们可以控制数据库操作的提交和回滚;

另外早期的SPRING事务管理必须是基于接口的,当现在改变啦!为啥必须基于接口?看看这段代码:


Proxy根据InvocationHandler接口的实现类中的内容生成最后供用户调用的Subject接口 ,

newProxyInstance 中有个参数必须是接口的集合,这个就是原因




//生成RealSubject 的代理类 
Subject subject = (Subject) Proxy.newProxyInstance(	rsClassLoader,rsInterfaces, ds);



  • 大小: 26.7 KB
分享到:
评论

相关推荐

    浅析美国建筑事务所经营管理模式.doc

    浅析美国建筑事务所经营管理模式.doc

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    深入浅析Spring AOP的实现原理1

    Spring AOP主要基于两种代理模式来实现:静态代理和动态代理。 1. 静态代理: 在静态代理中,代理类和目标类需要实现相同的接口,代理类持有目标类的引用,并在调用目标类方法前后添加额外的逻辑,比如日志记录。...

    浅析两种安全运维管理模式 (2).docx

    浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx...

    浅析JAVA代理模式.pdf

    浅析JAVA代理模式.pdf

    《浅析如何以人为本 实现班组安全管理》范文.docx

    《浅析如何以人为本 实现班组安全管理》范文.docx

    Spring中使用classpath加载配置文件浅析

    在Spring中,可以通过ApplicationContext接口的实现类,比如ClassPathXmlApplicationContext,来加载位于classpath中的配置文件。例如,创建一个ApplicationContext对象的代码如下: ```java ApplicationContext ...

    深入浅析Spring 的aop实现原理

    在实际开发中,我们可以使用Spring AOP来实现如事务管理、日志记录等功能,避免在业务代码中插入这些与核心业务逻辑无关的代码,从而保持代码的清晰和简洁。通过理解Spring AOP的实现原理,开发者可以更好地设计和...

    浅析麦当劳经营模式

    浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式

    JAVA DAO模式浅析.pdf

    这可以通过编程式事务管理或声明式事务管理实现,例如在Spring框架中,可以使用`@Transactional`注解来管理事务。 4. **连接池**:为了提高性能和资源利用率,通常会在DAO层使用数据库连接池,如C3P0、HikariCP等,...

    浅析SpringCache缓存1

    1. **缓存注解**:Spring 提供了多种注解来实现缓存管理。其中,`@Cacheable` 用于标记一个方法,当方法被调用时,其返回值会被缓存起来,以便后续相同参数的调用可以直接从缓存中获取结果,减少数据库或远程服务的...

    浅析23种软件设计模式

    12. 代理模式:代理模式的主要思想是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。这种模式的优点是可以在客户和目标对象之间起到中介的作用,但缺点是增加了系统的复杂度。 13. 责任链模式:...

    Spring 最新动态:浅析 Spring 3.1、3.2 和 3.3

    此外,Spring 3.3增强了对RESTful服务的支持,提供更好的HATEOAS(Hypermedia as the Engine of Application State)实现,使得构建基于超媒体的Web服务变得更加容易。同时,Spring 3.3也对消息传递进行了改进,加强...

    浅析美国市场经济模式.docx

    浅析美国市场经济模式.docx

    Spring 注解学习手札(四) 持久层浅析

    在本篇《Spring注解学习手札(四)...结合Spring Data JPA的自动方法生成和事务管理,开发者能够更专注于业务逻辑,提升开发效率。在实际项目中,我们需要根据需求灵活运用这些注解,以实现高效且健壮的持久层设计。

    浅析PostgreSQL事务处理机制

    ### 浅析PostgreSQL事务处理机制 #### PostgreSQL简介 PostgreSQL是一款开源的对象关系数据库系统,其历史可以追溯至1977年,由Michael Stonebraker领导的加州伯克利分校的INGRES项目发端。它支持大部分SQL标准,...

    java方向设计模式浅析

    在阅读《设计模式浅析》这篇论文时,我们可以期待作者对这些模式的深入解析,包括它们的适用场景、如何在Java中实现,以及如何通过实例来理解它们的效果。此外,论文可能还会涉及设计原则,如开闭原则(对扩展开放,...

Global site tag (gtag.js) - Google Analytics