模拟用户调用:
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
### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...
Spring AOP主要基于两种代理模式来实现:静态代理和动态代理。 1. 静态代理: 在静态代理中,代理类和目标类需要实现相同的接口,代理类持有目标类的引用,并在调用目标类方法前后添加额外的逻辑,比如日志记录。...
浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx浅析两种安全运维管理模式 (2).docx...
浅析JAVA代理模式.pdf
《浅析如何以人为本 实现班组安全管理》范文.docx
在Spring中,可以通过ApplicationContext接口的实现类,比如ClassPathXmlApplicationContext,来加载位于classpath中的配置文件。例如,创建一个ApplicationContext对象的代码如下: ```java ApplicationContext ...
在实际开发中,我们可以使用Spring AOP来实现如事务管理、日志记录等功能,避免在业务代码中插入这些与核心业务逻辑无关的代码,从而保持代码的清晰和简洁。通过理解Spring AOP的实现原理,开发者可以更好地设计和...
浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式,浅析麦当劳经营模式
这可以通过编程式事务管理或声明式事务管理实现,例如在Spring框架中,可以使用`@Transactional`注解来管理事务。 4. **连接池**:为了提高性能和资源利用率,通常会在DAO层使用数据库连接池,如C3P0、HikariCP等,...
1. **缓存注解**:Spring 提供了多种注解来实现缓存管理。其中,`@Cacheable` 用于标记一个方法,当方法被调用时,其返回值会被缓存起来,以便后续相同参数的调用可以直接从缓存中获取结果,减少数据库或远程服务的...
12. 代理模式:代理模式的主要思想是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。这种模式的优点是可以在客户和目标对象之间起到中介的作用,但缺点是增加了系统的复杂度。 13. 责任链模式:...
此外,Spring 3.3增强了对RESTful服务的支持,提供更好的HATEOAS(Hypermedia as the Engine of Application State)实现,使得构建基于超媒体的Web服务变得更加容易。同时,Spring 3.3也对消息传递进行了改进,加强...
浅析美国市场经济模式.docx
在本篇《Spring注解学习手札(四)...结合Spring Data JPA的自动方法生成和事务管理,开发者能够更专注于业务逻辑,提升开发效率。在实际项目中,我们需要根据需求灵活运用这些注解,以实现高效且健壮的持久层设计。
### 浅析PostgreSQL事务处理机制 #### PostgreSQL简介 PostgreSQL是一款开源的对象关系数据库系统,其历史可以追溯至1977年,由Michael Stonebraker领导的加州伯克利分校的INGRES项目发端。它支持大部分SQL标准,...
在阅读《设计模式浅析》这篇论文时,我们可以期待作者对这些模式的深入解析,包括它们的适用场景、如何在Java中实现,以及如何通过实例来理解它们的效果。此外,论文可能还会涉及设计原则,如开闭原则(对扩展开放,...