概述
代理模式:为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象,创建开销大的对象,需要安全控制的对象
代理模式:静态代理,动态代理,(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 可以作为增强方法,比如我们源码中,你是不能修改器代码的,但是你想对其进行修改,就可以使用动态代理