设计模式之动态代理模式实战
昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要。动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用。
动态代理有两种试,一是通过JDK自带的API实现动态代理,二是通过别的字节码框架实现,如cglib。
需要注意的是JDK只能针对接口实现动态代理,不能代理普通类,使用具有局限性。而cglib可以代理接口及所有的普通类。
下面拿昨天保存用户信息的例子继续用动态代理来实现。
用户接口
public interface UserInterface {boolean saveUser(User user);}
用户接口实现
public class UserInterfaceImpl implements UserInterface {@Overridepublic boolean saveUser(User user) {System.out.println("保存用户: " + user.getName());return true;}
}
public class Test {public static void main(String[] args) {// JDK动态代理testJDKProxy();// Cglib接口代理testCglibInterfaceProxy();// Cglib类代理testCglibClassProxy();}private static void testJDKProxy() {User user = new User();user.setName("tom");UserProxy.getUserProxy().saveUser(user);}static class UserProxy {private static final InvocationHandler USER_HANDLE = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK接口动态代理-开始保存用户");Object result = method.invoke(new UserInterfaceImpl(), args);System.out.println("JDK接口动态代理-保存用户结果: " + result);System.out.println();return result;}};public static UserInterface getUserProxy() {UserInterface userInterface = (UserInterface) Proxy.newProxyInstance(UserProxy.class.getClassLoader(),new Class[] { UserInterface.class }, USER_HANDLE);return userInterface;}}private static void testCglibInterfaceProxy() {User user = new User();user.setName("tom");UserCglibProxy.getUserProxy().saveUser(user);}static class UserCglibProxy {private static final net.sf.cglib.proxy.InvocationHandler USER_HANDLE = new net.sf.cglib.proxy.InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Cglib接口动态代理-开始保存用户");Object result = method.invoke(new UserInterfaceImpl(), args);System.out.println("Cglib接口动态代理-保存用户结果: " + result);System.out.println();return result;}};public static UserInterface getUserProxy() {UserInterface userInterface = (UserInterface) net.sf.cglib.proxy.Proxy.newProxyInstance(UserCglibProxy.class.getClassLoader(), new Class[] { UserInterface.class }, USER_HANDLE);return userInterface;}}private static void testCglibClassProxy() {User user = new User();user.setName("tom");UserInterfaceImpl userImpl = (UserInterfaceImpl) ClassCgLibProxy.getUserProxy(new UserInterfaceImpl());userImpl.saveUser(user);}static class ClassCgLibProxy {private static final MethodInterceptor USER_HANDLE = new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Cglib类动态代理-开始保存用户");Object result = proxy.invokeSuper(obj, args);System.out.println("Cglib类动态代理-保存用户结果: " + result);System.out.println();return result;}};public static Object getUserProxy(Object target) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(USER_HANDLE);return enhancer.create();}}}
结果输出:
JDK接口动态代理-开始保存用户
保存用户: tom
JDK接口动态代理-保存用户结果: trueCglib接口动态代理-开始保存用户
保存用户: tom
Cglib接口动态代理-保存用户结果: trueCglib类动态代理-开始保存用户
保存用户: tom
Cglib类动态代理-保存用户结果: true
从例子看出,使用也并不复杂,动态代理与静态代理最主要的区别在于,静态代理是编译期间就确定好的代理关系,而动态代理是运行期间由JVM通过反射等技术生成的代理对象,不存在class文件,代理类与被代理类之间的关系是继承关系,所以,普通类final的方法是不能被动态代理的。
设计模式之动态代理模式实战相关推荐
- 设计模式之静态代理模式实战
转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...
- 设计模式之动态代理模式
一.代理模式分为静态代理和动态代理 代理模式分为静态代理模式和静态代理模式,相对于静态代理模式,动态代理模式理解起来更加抽象. 二.想要了解动态代理模式首先要了解动态代理类 Java动态代理类位于Ja ...
- Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...
- 设计模式之代理模式、动态代理模式、Cglib代理模式
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...
- 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式
文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...
- 设计模式之----Java动态代理模式
在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...
- 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...
- Java设计模式之JDK动态代理模式
先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...
- 软件设计模式 | 动态代理模式
文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...
最新文章
- 栈空间不够会报错吗_网站更换域名和空间会对优化有影响吗?
- filter的原理(转)
- .netcore2.0 发布CentOS7
- 专访 | PP云技术副总监:如何使用机器学习算法优化分发链路
- mysql正在运行安全文件怎么办_MySQL服务器运行的安全文件化选项,所以它不能执行该语句什么情? 爱问知识人...
- 使用手机企业微信创建自己的企业(公司)
- 携程启动“2021混合办公试验”,梁建章:拥抱疫情之外的在家办公
- nginx 405 not allowed问题解决方法
- 「08」回归的诱惑:深入浅出逻辑回归(Python实战篇)
- 大数据Hadoop学习记录(3)----基于JAVA语言的HDFS文件过滤与合并
- win10使用debug
- php json转数组不成功,phpjson转数组出错
- WinDbg分析蓝屏dump原因
- js控制表格实时编辑
- 杜鹏的个人博客 Flex使用Blazeds与Java交互及自定义对象转换详解
- 模拟城市服务器连接中断 正试着,【模拟城市5】确认DRM在线 中断不会被踢
- 计算机无法使用本地搜索,电脑资源管理器搜索功能无法使用解决措施
- 《疯狂Java讲义》第5章 面向对象(上)——课后练习
- “大脑营养剂”给你好睡眠
- KVM虚机转换为VMware虚机
热门文章
- 为Docker Swarm添加调度策略
- RadioGroup结合RadioButton使用切换Fragment片段
- Python学习札记(二) python3.5安装 + (假装是)第一个Python程序
- NFS Volume Provider(Part I) - 每天5分钟玩转 OpenStack(62
- 【技术总结】几种常用的无线串行通信技术
- 如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创
- linux select 多路复用机制
- Ubuntu 16.04下Caffe-SSD的应用(七)——制作自己的VOC2007数据集
- c与c++中struct区别
- java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题