1、静态代理

2、JDK动态代理

JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口,其核心是InvocationHandler接口和Proxy类。

jdk动态代理之所以只能代理接口是因为代理类本身已经extends了Proxy,而java是不允许多重继承的,但是允许实现多个接口,因此才有cglib的需要吧。

public interface Math {public int div(int a, int b) throws Exception;
}@Component
public class MathCaculator implements Math {public MathCaculator() {System.out.println("MathCaculator构造器***************");}public int div(int a, int b) throws Exception {System.out.println("除法的方法主体");return a/b;}
}public class DynamicProxy implements InvocationHandler {Object targetObject;public Object getProxyObejct(Object targetObject) {this.targetObject = targetObject;return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {long startTime = System.currentTimeMillis();Thread.sleep(100);Object result=method.invoke(targetObject, args);long endTime = System.currentTimeMillis();System.out.println("耗时"+(endTime-startTime)+"秒");System.out.println("结果+"+result);return result;}
}public class Test {public static void main(String[] args) throws Exception {Math math = (Math) new DynamicProxy().getProxyObejct(new MathCaculator());math.div(10,5);}
}

3、CGLIB动态代理 

对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

如果目标类没有实现接口,那就要选择使用CGLIB来动态代理目标类。CGLIB是通过继承的方式做的动态代理,因此,如果某个类被标记为final,那么它是无法使用CGLIB做动态代理。CGLIB会使生成的代理类继承当前的对象,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibDynamicProxy implements MethodInterceptor {Object targetObject;public Object getProxyObject(Object object){System.out.println("cglib创建代理");this.targetObject = object;Enhancer enhancer = new Enhancer();enhancer.setCallback(this);enhancer.setSuperclass(targetObject.getClass());return enhancer.create();}@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {long startTime = System.currentTimeMillis();Thread.sleep(100);Object result=methodProxy.invoke(targetObject, args);long endTime = System.currentTimeMillis();System.out.println("耗时"+(endTime-startTime)+"秒");System.out.println("结果+"+result);return result;}
}

  

转载于:https://www.cnblogs.com/yaohuiqin/p/10488853.html

Spring之代理模式实例相关推荐

  1. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  2. Spring AOP 代理模式

    记录几篇关于AOP & 代理模式 的博客,写的非常好,感谢作者分享! Java中的代理模式--静态代理以及分析静态代理的缺点 Java中动态代理的两种方式JDK动态代理和cglib动态代理以及 ...

  3. spring的代理模式

    1.何为代理模式 如何实现在不修改源码的基础上实现代码功能的增强呢?spring为我们提供了代理模式.所谓的代理模式通俗来说就是一个中介,它给某一个对象提供一个代理对象,并由代理对象控制原对象的引用, ...

  4. 设计模式—代理模式以及动态代理的实现

    代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.被代理的对象可以是远程对象.创建开销大的对象或需要安全控制的对象. 一 ...

  5. 设计模式|代理模式、以《安家》为模型轻松理解静态代理和动态代理

    目录 代理模式概念 代理模式实例 静态代理 动态代理 代理模式概念 代理模式是设计模式中运用较广泛且容易理解的一个.代理模式的概念是为其他对象提供一个代理,以控制这个对象的访问,代理对象在客户端和目标 ...

  6. 二十四种设计模式之代理模式

    一.什么是代理模式? 简单来说,代理模式就相当于我们生活中的中介,比如我们租房子通过房产中介或者是租房的app,买电影票通过app,就是我们实现事情的一个媒介. 二.代理模式实例 1.就比如说,程序员 ...

  7. 设计模式:代理模式是什么,Spring AOP还和它有关系?

    接着学习设计模式系列,今天讲解的是代理模式. 定义 什么是代理模式? 代理模式,也叫委托模式,其定义是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.它包含了三个角色: Subject: ...

  8. Spring源码学习笔记:经典设计模式之代理模式

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 0.代理模式(Proxy Pattern) 指为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端 ...

  9. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

最新文章

  1. java 中ln是什么意思_JavaBean命名规范
  2. 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
  3. 关于Python中的self
  4. java静态成员方法_java的静态成员、静态方法的注意事项!
  5. 64位ubuntu arm-linux-gcc,在ubuntu 64位的机器上执行arm-linux-gcc提示 no such file or directory【转】...
  6. Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展
  7. 学科前沿技术专题结课作业
  8. LUT Utility for FCPX(Luts调色文件加载工具)
  9. DataGrip 格式化SQL 自定义SQL格式化
  10. UE4(虚幻4)引擎下载与安装
  11. 单片机c语言仿真,单片机c语言教程:C51表达式语句及仿真器
  12. java web 教学视频_超全面的JavaWeb视频教程
  13. 由内而外全面造就自己(三)
  14. 汇编中的OFFSET(OFFSET为属性操作符,表示应该把其后跟着的符号地址的值(不是内容)作为操作数)
  15. PS CC2017安装及破解
  16. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例62
  17. ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug
  18. 几本关于用户体验的书籍
  19. 【Unity】如何优雅地实现任何线性效果?
  20. jMeter性能测试之思考时间

热门文章

  1. FLEX:DataGrid分页.
  2. 解决访问被拒绝:Microsoft.Web.UI.WebControls的问题
  3. Cannot resolve table 't_daily'
  4. 软件设计师11-数据库
  5. exchange2010查询用户邮箱配额、设置用户邮箱配置的方法
  6. 学会这个大屏神器,低代码开发高端可视化大屏不在话下
  7. Linux的用户管理
  8. maven 打包java项目_如何使用maven打包java项目?
  9. 在一个html中使用另一个html数据,如何为某些HTML标签存储任意数据
  10. 去掉超链接的颜色_Word中怎么快速批量删除去掉网站超链接技巧