「多级代理java」多级代理模式

博主:adminadmin 2023-01-26 22:12:15 371

今天给各位分享多级代理java的知识,其中也会对多级代理模式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java程序性能优化-代理模式(1)

  代理模式( )

代理模式也是一种很常见的设计模式 它使用代理对象完成用户请求 屏蔽用户对真实对象的访问 就如同现实中的代理一样 代理人被授权执行当事人的一些事宜 而无需当事人出面 从第三方的角度看 似乎当事人并不存在 因为他只和代理人通信 而事实上 代理人是要有当事人的授权 并且在核心问题上还需要请示当事人

在现实中 使用代理的情况很普遍 而且原因也很多 比如 当事人因为某些隐私不方便出面 或者当事人不具备某些相关的专业技能 而需要一个职业人员来完成一些专业的操作 也可能由于当事人没有时间处理事务 而聘用代理人出面

在软件设计中 使用代理模式的意图也很多 比如因为安全原因 需要屏蔽客户端直接访问真实对象 或者在远程调用中 需要使用代理类处理远程方法调用的技术细节(如RMI) 也可能是为了提升系统性能 对真实对象进行封装 从而达到延迟加载的目的 在本小节中 主要讨论使用代理模式实现延迟加载 从而提升系统的性能和反应速度

代理模式的结构

代理模式的主要参与者有 个 如表 所示

表   代理模式角色

以一个简单的示例来阐述使用代理模式实现延迟加载的方法及其意义 假设某客户端软件 有根据用户请求 去数据库查询数据的功能 在查询数据前 需要获得数据库连接 软件开启时 初始化系统的所有类 此时尝试获得数据库连接 当系统有大量的类似操作存在时(比如xml解析等) 所有这些初始化操作的叠加 会使得系统的启动速度变得非常缓慢 为此 使用代理模式 使用代理类 封装对数据库查询中的初始化操作 当系统启动时 初始化这个代理类 而非真实的数据库查询类 而代理类什么都没有做 因此 它的构造是相当迅速的

在系统启动时 将消耗资源最多的方法都使用代理模式分离 就可以加快系统的启动速度 减少用户的等待时间 而在用户真正做查询操作时 再由代理类 单独去加载真实的数据库查询类 完成用户的请求 这个过程就是使用代理模式实现了延迟加载

注意 代理模式可以用于多种场合 如用于远程调用的网络代理 考虑安全因素的安全代理等 延迟加载只是代理模式的一种应用场景

延迟加载的核心思想是 如果当前并没有使用这个组件 则不需要真正地初始化它 使用一个代理对象替代它的原有的位置 只要在真正需要使用的时候 才对它进行加载 使用代理模式的延迟加载是非常有意义的 首先 它可以在时间轴上分散系统压力 尤其在系统启动时 不必完成所有的初始化工作 从而加速启动时间 其次 对很多真实主题而言 在软件启动直到被关闭的整个过程中 可能根本不会被调用 初始化这些数据无疑是一种资源浪费 图 显示了使用代理类封装数据库查询类后 系统的启动过程

图   代理类的工作流程

若系统不使用代理模式 则在启动时就要初始化DBQuery对象 而使用代理模式后 启动时只需要初始化一个轻量级的对象DBQueryProxy

系统的结构图如图 所示 IDBQuery是主题接口 定义代理类和真实类需要对外提供的服务 在本例中了定义了实现数据库查询的公共方法request()函数 DBQuery是真实主题 负责实际的业务操作 DBQueryProxy是DBQuery的代理类

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27834

java中的代理有什么用??

建议看看《java与模式》代理模式那节。代理就是对一个类进行的代理,或是托管。简单的讲就是对原有类加了一个壳,当程序执行的时候不执行原来的类,首先执行代理类,代理类,可以决定是否执行真正要调用的类。

用途,最常见的就是数据库连接池,数据库连接池里的连接是不能被关闭的,那么,你总不能单独写一个connectionClose方法吧?所以就要代理掉Conection接口的实现类(java的代理是面向接口的代理),代理类判断当执行的方法是close方法的时候就不予执行close操作。其他就是spring中的aop,大量用到了代理。事实上,struts的拦截器也是一种代理。

什么是JAVA代理模式,一直理解不了。

简单点说就是你要调用一个接口test(),这里面有一个”说话“的方法,当你实例化之后就可以调用这方法,但是你发现你不止要”说话“这个功能,你还要实现一个”吃饭“sing()的功能,

那么我们既不能在test接口里增加sing()方法,又不能在每个前端都增加sing方法,我们只有增加一个代理类talkProxy,这个代理类里实现talk和sing方法,然后在需要sing方法的客户端调用代理类即可.大概就是这个意思 全手打, 望采纳。

Java 动态代理如何扩

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子

用图表示如下:

代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象

1.1.静态代理(类似于装饰者模式)

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

下面举个案例来解释:

模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方 式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象.

需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法

代码示例:

接口:IUserDao.java

/** 

* 接口 

*/

public interface IUserDao { void save();}

目标对象:UserDao.java

/**

 * 接口实现

 * 目标对象

 */

 public class UserDao implements IUserDao {

     public void save() {

             System.out.println("----已经保存数据!----");

     }

 }

代理对象:UserDaoProxy.java

/** 

 * 代理对象,静态代理 

 */

 public class UserDaoProxy implements IUserDao{

     //接收保存目标对象

     private IUserDao target;

     public UserDaoProxy(IUserDao target){        

         this.target=target;    

     }

     public void save() {

         System.out.println("开始事务...");

         trget.save();//执行目标对象的方法

         System.out.println("提交事务...");    

     }

}

测试类:App.java

/** 

 * 测试类 

 */

 public class App {    

     public static void main(String[] args) {        

         //目标对象        

         UserDao target = new UserDao(); 

         //代理对象,把目标对象传给代理对象,建立代理关系        

         UserDaoProxy proxy = new UserDaoProxy(target);        

         proxy.save();//执行的是代理的方法    

     }

 }

java动态代理实现步骤?

您好,提问者:

1、可以使用apache开发的HttpClient.jar来实现。

2、如果纯Java代码,首先创建一个Proxy类来进行指定协议,比如:Proxy.HTTP,构造方法请见JDK API文档,另外指定一个SocketAddress的ip和端口,一般http端口为80。

接下来就是访问Http网站了,使用URL url = new URL("xxx");地址,然后使用HttpConnection对象,把Proxy指定进去就可以了。

java动态代理怎样实现?

在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。

其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现,如下,HelloWorld接口定义的业务方法,HelloWorldImpl是HelloWorld接口的实现,HelloWorldHandler是InvocationHandler接口实现。代码如下:

业务接口:

public interface HelloWorld {

void sayHelloWorld() ;

}

业务接口实现:

public class HelloWorldImpl implements HelloWorld {

public void sayHelloWorld() {

System.out.println("Hello World!");

}

}

InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

//要代理的原始对象

private Object objOriginal;

/**

* 构造函数。

* @param obj 要代理的原始对象。

*/

public HelloWorldHandler(Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//方法调用之前

doBefore();

//调用原始对象的方法

result = method.invoke(this.objOriginal ,args);

//方法调用之后

doAfter();

return result ;

}

private void doBefore() {

System.out.println("before method invoke!");

}

private void doAfter() {

System.out.println("after method invoke!");

}

}

测试代码:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {

HelloWorld hw = new HelloWorldImpl();

InvocationHandler handler = new HelloWorldHandler(hw);

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

hw.getClass().getClassLoader(),

hw.getClass().getInterfaces(),

handler);

proxy.sayHelloWorld();

}

}

�0�1 首先获取一个业务接口的实现对象;

�0�1 获取一个InvocationHandler实现,此处是HelloWorldHandler对象;

�0�1 创建动态代理对象;

�0�1 通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。

运行测试类输出如下:

before method invoke!

Hello World!

after method invoke!

此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP

多级代理java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于多级代理模式、多级代理java的信息别忘了在本站进行查找喔。