模拟用户调用:
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
浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx...
浅析JAVA代理模式.pdf
浅析Java设计模式【3】——代理.pdf
《浅析如何以人为本 实现班组安全管理》范文.docx
浅析直播电商模式.pdf
浅析C#编程中的内存管理浅析C#编程中的内存管理
浅析档案管理电子信息化管理模式.docx
浅析两种安全运维管理模式.docx浅析两种安全运维管理模式.docx浅析两种安全运维管理模式.docx浅析两种安全运维管理模式.docx浅析两种安全运维管理模式.docx浅析两种安全运维管理模式.docx浅析两种安全运维管理模式....
浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析两种安全运维管理模式.pdf浅析...
浅析ArrayList内部实现 资源源于不但搜索,自由源于不但努力
Spring 最新动态:浅析 Spring 3.1、3.2 和 3.3
浅析我国中小企业战略管理,陈允球,,战略管理在管理学中有着十分重要的意义和地位,其在诸多大企业的实践中充分表现出其有效性,但其在中小企业又有怎么的发展,其发
浅析O2O模式下智能家居运营模式.pdf
浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式
这篇文章是对于当前常见的23种设计模式的一种浅析与解释,参考别人的文档,并按照一定的格式以论文的方式进行排版,希望能分享一下。
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
浅析Java设计模式【1】——观察者!
Netty实现原理浅析
浅析CAD电子文件管理模式的建立.pdf