代理模式
代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的返问。代理类负则为委托类预处理信息,过滤信息并转发信息,以及消费被委托类处理后的后续处理。
Jdk动态代理
Jdk动态代理的实质是java自己创建一个动态的代理类,这个代理类继承了被代理类的全部接口,所以jdk动态代理的前提是被代理对象必须实现了接口。我们在调用代理对象的方法时实际上是调用的被代理对象的方法,并在invoke方法中对其进行增强。
Java动态代理类位于java.lang.reflect包下,一般设计到以下主要两个类:
- Interface InvocationHandler
该接口只定义了一个方法,此方法是代理增强的关键方法。
第一个参数是代理对象本身,第二个参数是被代理的方法,第三个参数第二个参数中方法的参数数组。我们需要在代理处理工具类中实现这个抽象方法。
- Class proxy
该类是一个动态代理工具类,具体的类结构图如下
例子
前两个是被代理类,后面是对被代理类的增强类,最后调用Proxy的方法获得动态代理对象,然后调用sleep方法,结果如下:
继续往下看
代理对象包含了被代理对象的增强类,而增强类的对象又包含了被代理对象。另外jdk动态代理名命是以$proxy加数字组合的形式命名。
Cglib动态代理
首先是cglib动态代理是无法代理final修饰的方法的。其次jdk动态代理是代理类和被代理类实现共同的接口,而cglib动态代理是通过继承被代理类,然后重写方法。
Jdk动态代理是通过Proxy类生成代理类,而cglib也提供了一个这样的类,Enhancer
Jdk动态代理是提供实现InvocationHandler接口,而cglib也提供了一个类似的类,MethodInterceptor方法拦截器。
因为cglib需要其他依赖类,所以这里新建一个maven项目,并导入maven依赖
因为不是依赖接口来实现动态代理,而是针对无接口的类做动态代理,这里实现一个类father
先看一下方法拦截器的注释,就大概理解了这个cglib怎么样一个原理了
然后建立一个方法拦截器,首先我们先看下里面每个参数分别是什么
最后使用Enhancer生成代理类
运行结果如下
使用代理方法执行
未完待续