代理模式 、JDK动态代理、cglib动态代理
代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?
因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。
再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的
想法。public interface Sourceable { public void method();
} public class Source implements Sourceable { @Override public void method() { System.out.println("the original method!"); }
} public class Proxy implements Sourceable { private Source source; public Proxy(){ super(); this.source = new Source(); } @Override public void method() { before(); source.method(); atfer(); } private void atfer() { System.out.println("after proxy!"); } private void before() { System.out.println("before proxy!"); }
}public class ProxyTest { public static void main(String[] args) { Sourceable source = new Proxy(); source.method(); } } 输出:before proxy!
the original method!
after proxy!
代理模式的应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!jdk动态代理
特点:只能对实现了接口的类生产代理,不能针对类定义接口
/** * 创建业务接口,包含业务可以提供对外的接口 * */
public interface UserService{ /** * 目标方法 */ public void add();
} 定义实现类
/** * 创建业务接口实现类 * */
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("----------add----------"); }
} 定义代理
/** * 自定义简单的Invocation,对接口提供的方法进行增强 * * @author Fighter * @date 2016-04-19 */
public class MyInvocationHandler implements InvocationHandler { //目标对象 private Object target; /** * 构造方法 * @param target 目标对象 */ public MyInvocationHandler(Object target) { super(); this.target=target; } * 执行目标对象的方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在目标方法执行前简单打印一下 System.out.println("----------before----------"); //执行目标方法对象 Object result=method.invoke(target, args); //在目标方法执行之后简单打印一下 System.out.println("----------after----------"); return result; } /** * 获取目标对象的代理对象 * @return 代理对象 * this.target.getClass().getInterfaces()//获取被代理对象实现的所有接口*/ public Object getProxy(){ return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), this.target.getClass().getInterfaces(),this); } }jdk动态代理测试public class ProxyTest{ @Test public void testProxy() throws Throwable{ //实例化目标对象 UserService userService=new UserServiceImpl(); //实例化Invocation MyInvocationHandler invocationHandler=new MyInvocationHandler(userService); //根据目标生成代理对象 UserService proxy=(UserService)invocationHandler.getProxy(); //调用代理对象方法 proxy.add(); }
} CGLIB动态代理示例
DK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对
类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是
继承,所以不能对final修饰的类进行代理。 CGLIB是一个强大的高性能的代码生成包。定义实现类
/** * 这个是没有实现接口的实现类 * */
public class BookFacadeImpl { public void addBook() { System.out.println("增加图书的普通方法..."); }
} /** * 使用cglib动态代理 * */
public class BookFacadeCglib implements MethodInterceptor { private Object target; /** * 创建代理对象 * * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事物开始"); proxy.invokeSuper(obj, args); System.out.println("事物结束"); return null; } } public class TestCglib { public static void main(String[] args) { BookFacadeCglib cglib=new BookFacadeCglib(); BookFacadeImpl bookCglib=(BookFacadeImpl)cglib.getInstance(new BookFacadeImpl()); bookCglib.addBook(); }
}总结
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所
花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK
方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。
代理模式 、JDK动态代理、cglib动态代理相关推荐
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)
代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...
- 轻松学,Java 中的代理模式(proxy)及动态代理
我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...
- java代理模式-原来你是这样的代理
这几天在看一些框架源码时看到了一个很奇妙的设计模式,有种熟悉个感觉,一时想不出是什么模式,后面经过了解才知道是动态代理,就这样带着好奇心学习了这个模式,更深入了解代理会发现不仅有静态和动态,还有很多其 ...
- 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...
- 代理模式(Java版)-静态代理、JDK动态代理和CGLib动态代理
代理模式前传 前几天有个小朋友问到我代理模式,这个我拿手的嘛.废话不多说,直接开讲?这是不可能的. 一般呢,讲模式之前呢,礼貌上都要讲个前传.象我这种老了根本不怕没有故事祭奠的人,随手一个前传开始. ...
- Java动态代理之JDK实现和CGlib实现
一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现 ...
- 【过程记录】aop学习·实现动态代理的jdk方法和cglib方法和使用实例
文章目录 介绍 jdk动态代理实例 cglib动态代理实例 介绍 JDK的动态代理只能代理实现了接口的类,而不能实现接口的类就不可以使用JDK动态代理,cglib是针对类来实现代理的,它的原理是针对指 ...
- python中代理模式分为几种类型_代理模式
JDK 自带的动态代理 java.lang.reflect.Proxy:生成动态代理类和对象: java.lang.reflect.InvocationHandler(处理器接口):可以通过invok ...
- 设计模式(11)代理模式The Proxy Pattern - 1 - 远程代理rmi
代理模式 假设现在需要设置一个监视器Monitor,能够监视糖贩卖机GumballMachine的状态,位置信息.还有多少糖果等.一个简单的想法就是创建一个Monitor的类,构造参数包括Gumbal ...
最新文章
- PC-lint 的代码实例
- WPF使用IDataErrorInfo进行数据校验
- CSS实现鼠标移入图片边框有小三角
- 直播预告 | AAAI 2022论文解读:基于生成模型的语音/歌声合成与歌声美化
- java线性表合并_单链表的合并(Java实现)
- CSS——规避脱标流和vertical-align
- java 匹配mysql按钮_使用Java在mysql查询中设置匹配函数
- 源码包编译安装python_Python3.7源码包编译安装-Go语言中文社区
- 改善深层神经网络:超参数调整、正则化以及优化 —— 3.1调试处理
- 服务器摆放需要预留U位么_卧室系列 | 选床+摆放新姿势,提升睡眠品质小技巧...
- 基于Multisim_UA741的四种波形发生器电路仿真
- 使用eclipse创建一个web登录界面项目
- Power bi 超市经典案例之销售分析(二)
- linux将一段时间内文件压缩,在 Linux 上压缩文件的 5 种方法
- 电脑蓝屏了,错误代码:0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
- background多背景
- 云服务器liunx系统怎么安装,云服务器怎么安装linux系统
- 电子产品长时间不充电导致无法开机、故障、充不满电等问题(如kindle:电池+叹号)
- influxdb内存过大和占用过多端口
- 如何使用WordPress插件添加约会预约日历