网站首页 > java教程 正文
什么是代理模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式中存在如下几种角色:
- 抽象角色(接口类):通过接口或抽象类声明真实角色实现的业务方法。
- 代理角色(代理类):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色(目标类):实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
为什么要使用代理模式
- 隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
- 开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
代理模式有哪些实现方式
如果按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序运行之前,代理类.class文件就已经被创建了。动态代理是在程序运行时动态创建代理类。
在详细介绍各种代理模式的实现方式之前,我们先定义一个抽象接口和一个真实的接口实现类:
静态代理
我们需要为真实角色创建一个代理类:
然后进行测试:
测试结果:
静态代理的实现过程非常的简单清晰,可以做到在符合开闭原则的情况下对目标对象进行功能扩展。但是如果我们有比较多的类需要使用到代理模式的时候,就需要创建与之对应的代理类,这会导致我们的项目类数量保障,可维护性急剧下降。
动态代理
动态代理模式把创建代理类的过程放在了代码运行时期,从而不需要我们手动的去创建代理类,只需要编写相应的动态处理器即可,这些动态处理器可以给不同的目标类使用。
目前比较常见的动态代理包括:JDK Proxy代理和Cglib代理。
JDK Proxy实现动态代理
创建一个动态处理器:
然后进行测试:
测试结果:
使用JDK的动态代理只需要两步:
- 创建一个动态代理Handler类,在这里处理需要代理的事务。
- 创建一个代理对象。创建代理类的时候需要传入需要代理的接口以及动态代理Handler类,所以JDK Proxy只能动态代理接口定义的方法,无法代理类中的非接口方法的。
Cglib实现动态代理
Cglib动态代理的使用方法和JDK Proxy的使用放是非常相似的,也是先创建一个动态代理Handler,然后再创建一个代理对象。不过Cglib采用的是基础class的方式实现的,所以不仅能够代理接口中的方法,也能够代理类中的非接口方法。
由于是采用的继承的方式实现,那些被final修饰的方法是无法进行代理的。
创建一个动态处理器:
然后进行测试:
测试结果:
Spring AOP
前面讲到的两种动态代理实现方式,相对于静态代理虽然大大的减少了开发工作量,但是在千变万化的业务需求面前,还是远远不够灵活。比如我们可能不希望代理整个类的全部方法,只希望代理其中部分方法,这个时候就需要强大的Spring AOP上场了。Spring AOP的底层使用的也是Proxy和Cglib,所以基本原理也是一样的。
本文只介绍Spring AOP简单的使用方式,AOP相关的用法、实现原理等内容会在接下来的一段时间里慢慢介绍。
首先我们需要创建一个Advice类:
然后配置一下Spring的Bean xml文件
最后进行测试:
测试结果:
对Spring AOP实现原理感兴趣的朋友可以点个关注,接下来的一段时间我将会从Spring AOP的源代码入手,详细的介绍Spring AOP的实现原理。
猜你喜欢
- 2024-10-24 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-24 Java 设计模式 之 代理模式 (1)(java设计模式之代理模式)
- 2024-10-24 Java设计模式:代理模式 vs. 装饰模式
- 2024-10-24 设计模式篇——代理模式详解(面试再问你代理模式,这么回答他)
- 2024-10-24 动态代理大揭秘,带你彻底弄清楚动态代理
- 2024-10-24 面试:Java的代理模式动态代理和静态代理区别,aop用的什么代理
- 2024-10-24 Java设计模式之代理模式(java代理类是什么)
- 2024-10-24 JAVA设计模式——代理模式(java编写代理服务)
- 2024-10-24 23种java设计模式之:门面模式、享元模式、代理模式
- 2024-10-24 Java 17中的动态代理:实现灵活的代理模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)