Java代理模型
Posted sweetnessinstinct
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代理模型相关的知识,希望对你有一定的参考价值。
引用文章 https://www.cnblogs.com/boboxing/p/8126046.html
代理模式是什么
代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。
代理的作用在于不修改目标代码的情况下,可以控制对目标的访问,可以在其前后加上自己的业务处理代码,甚至阻止对目标方法的访问,有点类似于过滤器和拦截器的作用。
代理模式
- 静态代理
- 继承 代理对象继承目标对象,重写增强方法 缺点:会产生代理类过多、非常复杂
- 聚合目标对象和代理对象实现同一接口,代理对象当中要包含目标对象 缺点:也会产生类爆炸,只是比继承少一点点
总结: 如果在不确定的情况下,不要去使用静态代理,一代写代码就会产生类,一旦产生类就会爆炸。
- 动态代理
1.JDK动态代理
-
-
调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象
-
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
接收的三个参数依次为:
ClassLoader loader:
指定当前目标对象使用类加载器,写法固定Class<?>[] interfaces:
目标对象实现的接口的类型,写法固定InvocationHandler h
:事件处理接口,需传入一个实现类,一般直接使用匿名内部类
生产的代理类 $Proxy0 extends Proxy implements targerInterface
2.CGLib动态代理
原理:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理。唯一需要注意的是 CGLib不能对声明为final的方法进行代理 ,因为CGLib原理是动态生成被代理类的子类。 详细分析引用:https://www.cnblogs.com/monkey0307/p/8328821.html
前提条件:
- 需要引入cglib的jar文件,由于Spring的核心包中已经包括了Cglib功能,所以也可以直接引入spring-core-3.2.5.jar
- 目标类不能为final
- 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法
以上是关于Java代理模型的主要内容,如果未能解决你的问题,请参考以下文章