在Spring中,有很多设计模式被应用,其中不乏代理模式。而代码模式中,就一定少不了动态代理模式。今天就对动态代理模式进行学习记录。
代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
动态代理:
代理类在程序运行时创建的代理方式被成为动态代理;动态代理有两种实现方式,一个是在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。另一种是,spring使用CGLIB库生成目标对象的子类。
我们先制造个代理场景,分别用两种方式进行实现。
我们每人人都要买房,买房的过程中,需要中介帮我们做一些事情。这个过程,就属于代理了。中介,就是其中的代理类。
1.jdk动态代理:
1.1先定义一个人类:

public interface IPerson {void  buyHouse();
}


李先生想买房

public class LiSir implements IPerson {@Overridepublic void buyHouse() {System.out.println("想买120平米的房子");}
}


3.jdk动态代理处理

public class JdkProxy implements InvocationHandler {private IPerson target;public JdkProxy(IPerson target) {this.target = target;}public IPerson  getInstance(){return (IPerson) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始找目标群体");Object object = method.invoke(target,args);System.out.println("找到,交易");return object;}
}


4.写个测试demo

 public static void main(String[] args) {JdkProxy jdkProxy = new JdkProxy(new LiSir());jdkProxy.getInstance().buyHouse();}


2.1接下来用CGLIB的动态代理实现

public class WuSir {public void buyHouse() {System.out.println("想买90平米");}
}


cglib的动态代理处理:

public class CglibProxy implements MethodInterceptor {public Object getInstance(Class<?> clazz){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(clazz);enhancer.setCallback(this);return  enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {// 这里处理System.out.println("开始找目标群体");Object object = methodProxy.invokeSuper(o,objects);System.out.println("找到,交易");return object;}
}


最后写个测试类看下结果

 public static void main(String[] args) {WuSir wuSir = (WuSir) new CglibProxy().getInstance(WuSir.class);wuSir.buyHouse();}


动态代理记录到这里。

设计模式之----Java动态代理模式相关推荐

  1. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  2. java动态代理模式初解

    第一部分 1.代理模式的作用和定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.  2.代 ...

  3. 关于java动态代理模式

    1. 动态代理 动态代理就是通过代理类是代理类与相关接口不直接发生联系,而在运行期(Runtime)实现动态关联. 动态代理主要用到java.lang.reflect包中的两个类,Invocation ...

  4. Java动态代理InvocationHandler的一点感悟

    目录 初衷 动态代理 实例讲解 总结 初衷 在研究Retrofit源码中,在创建网络请求接口实例时,就是通过Java动态代理模式,动态生成网络请求接口的代理类,并将代理类的实例创建交给了Invocat ...

  5. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

  6. java设计模式--工厂模式、静态代理模式、动态代理模式

    工厂模式 代码实现: 步骤一:创建一个接口 Car.java package FactoryMode;public interface Car {public void run(); } 步骤二:创建 ...

  7. Java的代理模式之静态代理和动态代理

    文章目录 静态代理 动态代理 jdk生成代理对象 cglib代理 代理模式简介: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目 ...

  8. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  9. Java设计模式(13)----------代理模式

    原文:https://www.imooc.com/article/24850 默课道可工程师学习地址:https://www.imooc.com/article/24850 介绍 代理模式中,在客户端 ...

最新文章

  1. 旷视MegEngine基本概念
  2. 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
  3. [机器学习]信息熵信息增益
  4. 使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践--转载
  5. URAL1204. Idempotents(扩展欧几里得)
  6. wx轮播图接口学习用json格式_零基础学小程序008----列表和轮播图的实现,小程序解析json数据...
  7. 2008 年 十大预测的总结 (只对了一半左右)
  8. Maya Calendar
  9. php 一个电子商城的产品分类字段_你会对这个字段做索引嘛,order by多个字段对索引的影响...
  10. opencv 学习第4课 将鼠标作为笔刷使用
  11. 搭载Apple芯片的Mac如何使用macOS恢复?
  12. kotlin埋点_GitHub - shajinyang/ilvdo-event-track: 埋点框架
  13. IEEE会议文章接收后提交流程
  14. 【零知ESP8266教程】快速入门28 六轴传感器模块的使用
  15. android模拟器安装教程视频教程,安卓模拟器安装教程 安卓模拟器怎么安装
  16. 网络原理考点之ADSL组网技术
  17. 七自由度机械臂设计分析——待更新
  18. 使用51单片机编写计时器(分钟,秒钟分离版)
  19. 云计算机渲染效果,什么是云渲染?云渲染这么用?
  20. 物联网项目——具体分工

热门文章

  1. ora-01033 ora-00214 ora-01113解决办法
  2. Hyperledger Fabric 环境搭建及Fabric 测试网络使用(区块链、联盟链)
  3. NXP系列芯片程序烧写方法
  4. java计算机毕业设计高校多媒体设备报修管理系统(附源码、数据库)
  5. X61T L7500割脉超频成功!
  6. 怎么获取网页高度、屏幕高度、滚动高度?
  7. Spark SQL运行流程及性能优化:RBO和CBO
  8. POM文件中,${xxx.version} 引用版本号爆红问题处理
  9. Nooice, 首次开通博客园
  10. 自定义 Android toast 字体大小