代理模式(proxy)

概述

代理模式:为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象,创建开销大的对象,需要安全控制的对象

代理模式:静态代理,动态代理,(JDK动态代理,Cglib代理)

静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同接口或者是继承相同父类

代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法

举例,一个哇哈哈工厂,生产哇哈哈,销售哇哈哈,销量大的话,就会开分厂,这个时候一般会找代理来帮他生产销售哇哈哈

目标对象

代理对象

测试

这个例子就实现了代理,代理对象对目标对象进行了加强

优缺点:

优点:在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展

缺点:因为代理对象和目标对象需要实现一样的接口,所以会有很多代理类,一旦接口增加方法,目标对象与代理对象都要维护。

动态代理

JAVA动态代理与静态代理相对,静态代理是在编译期就已经确定代理类和真实类的关系,并且生成代理类的。而动态代理是在运行期利用JVM的反射机制生成代理类,这里是直接生成类的字节码,然后通过类加载器载入JAVA虚拟机执行。现在主流的JAVA动态代理技术的实现有两种:一:JDK动态代理,另一是Cglib。

JDK代理

基本介绍:

代理对象,不需要实现接口,但是目标对象要实现接口

代理对象的生成是利用JDK的API,动态的在内存中构建代理对象

举例:还是使用哇哈哈工厂

目标对象类

代理对象类

测试及结果

此处使用的是Proxy.newProxyInstance 生成代理对象实例,需要传入三个参数

public static Object newProxyInstance(ClassLoader loader,  Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException 

ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法

Class<?>[] interfaces,目标对象实现的接口类型,使用泛型方法确认类型

 InvocationHandler h 事情处理,执行目标对象的方法是,回去出发事件处理器方法,会把当前执行的目标对象方法作为参数传入

当然此处也可以实现InvocationHandler  所以代理类如下:

测试及结果

这边使用的实现InvocationHandler  ,相当于把Proxy.newProxyInstance推后了,效果是一样的。

注意:代理转化,需要的是接口

Cglib代理

概述:

Cglib代理与JDK代理的最大区别就是不要实现任何接口

目标对象需要实现接口,用jdk代理

目标对象不需要实现接口,用Cglib代理

CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法,所以目标类不能用final修饰,代理方法不能有static修饰

需要导包:

<dependency>

        <groupId>cglib</groupId>

        <artifactId>cglib</artifactId>

        <version>2.2.2</version>

</dependency>

举例;

代理对象

作用:

在我前面的写的befor after 可以作为增强方法,比如我们源码中,你是不能修改器代码的,但是你想对其进行修改,就可以使用动态代理

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。