专业的JAVA编程教程与资源

网站首页 > java教程 正文

java的三种代理模式(java中的代理)

temp10 2024-10-24 17:21:59 java教程 10 ℃ 0 评论

1.代理模式很好地将两个直接关联的类进行了解耦,并且还可以在代理类中添加额外的代码,以进行特殊的处理,如果不采用代理模式,当两个类关联式,就需要再代码中直接调用另一个类B,这样如果需要添加一些特殊的处理,就通用要直接写在某一个类A的代码中,当有很多类都需要这些特殊处理时,每个类都必须编写相应的特殊处理的代码,就不能进行代码的复用,采用代理模式就能避免这些问题。

在程序开发过程中,经常会遇到一些和具体的业务逻辑无关的代码控制,如日志,权限,事务处理等,每段代码都添加日志或权限,事务处理的代码,程序编写起来会很麻烦,如果能有一个代理类,统一进行额外的处理,就可以放更多精力在业务逻辑代码中了。

java的三种代理模式(java中的代理)

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

代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用。代理模式主要由3部分组成:抽象目标类,具体目标类和代理类。

2.静态代理

静态代理由我们自己去生成的固定的代码进行编译。需要定义接口或者抽象的父类作为抽象目标类,具体目标类和代理类一起实现相同的接口或者是继承相同的类,然后通过调用相同的方法来调用目标对象的方法。

代码示例:

2.1)抽象目标类

java

2.2 )具体目标类,即被代理对象

java

2.3)代理类

java

测试类

java

运行结果:

开始事务。。。
==已经保存数据啦提交事务。。。

静态代理可以在不修改目标对象的功能前提下,对目标功能进行扩展。

缺点是:

因为代理对象需要与目标对象实现一样的接口,所以会有很多的代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。

解决此缺点的方法就是可以使用动态代理方式

3.动态代理

动态代理模式:在程序运行期间动态生成代理类。spring的aop面向切面编程就是使用动态代理模式来实现的。

JVM可以自己创建代理类,这样不仅提高了效率,而且更灵活。动态代理的3个主要的类:

proxy类、InvocationHandler、Method

通过proxy类和InvocationHandler接口可以生成JDK动态代理类和动态代理对象。

对于代理的接口的实际处理,是一个java.lang.reflect.InvocationHandler,它提供了一个invoke方法供实现者提供相应的代理逻辑的实现。可以兑实际的实现进行一些特殊的处理,像spring aop中的各种Adevice.

Proxy类中主要有3个方法:

java

每个代理实例都必须指定一个调用处理器,代理对象调用方法时,该方法会指派到调用处理器的invoke()中去。代理的方法封装成invoke中的method对象,其中的参数封装成Object[].

动态代理实现的步骤:

1)写一个代理类实现InvocationHandler接口,通过构造函数把代理对象(具体目标类)传入到此处理器中,在invoke方法中增加method.invoke(realSubject,args)。

2)在调用方法时,通过java.lang.reflect.Proxy的newProxyInstance来获取代理实现类,生成代理对象时,直接调用方法即可。

代码示例:

3.1)被代理的接口

java

3.2)具体实现类,被代理对象

java

3.3)动态代理类

java

3.4)调用

java

运行结果:

处理业务逻辑之前。
进行业务逻辑的处理
处理业务逻辑之后。Process finished with exit code 0

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表