常用的代理模式实现方式有JDK动态代理和CGLIB动态代理。
JDK动态代理是走的回调拦截,实现接口并生成代理类,再使用反射的技术去执行被代理类的目标方法。而且JDK动态代理是会拼接JAVA源代码的,然后编译成CLASS文件再读取到内存用。
CGLIB动态代理采用的是继承的模式生成代理类,底层是基于ASM字节码技术实现生成代理类。直接生成CLASS文件再读取到内存中。CGLIB在生成代理类的时候会先生成Fastclass这个索引类, 通过索引机制对我们目标类中的方法加上索引,原理:使用字节码技术获取当前所有的方法,对每个方法加上一个索引,直接根据索引调用到目标方法。通过proxy.invokeSuper这个方法执行动态调用。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
认真捋了一下动态代理和静态代理的使用场景,最直观的感受是用在拓展接口功能上面。比如有一个用户表,已经有了service层和impl实现层。当中有一个updateUser的方法,当外部请求到了控制层中的方法,再调用这个updateUser的时候,可以通过代理的方式去调用这个方法,并在方法前后写自己的逻辑代码,而不用修改这个updateUser的方法。当然这只是举例。
目前我觉得还是用在统一日志打印以及接口统一校验的地方用代理模式会比较合理也适合一些。本来是说CGLIB的效率会比JDK动态代理快很多,但是随着JDK的优化,度娘说JDK1.8以后JDK的动态代理的效率会高一点。有兴趣的测试的小伙伴可以去试试,我还是继续学其他了。后面还有好多设计模式,不过自己比较想学多线程、JVM调优、安全方面的东西。所以下期开始写其他的,设计模式估计要放到最后去咯。
PS:有2年没怎么认真的看书和学习了,真的有点抗拒,开始学的话会很认真一直看,但是这个开始有点难。。加油吧!