代理模式顾名思义就是,找一个代理人帮你做事。比如B是买房者,要买房必须要经过中介A代理买房,因为B没有联系房东的方式。这里有三个角色,一个是代理对象即A,一个是目标对象B,第三个是A和B的抽象接口对象C。
动态代理:可以使用类的动态加载机制(基于反射),在代码运行期间加载被代理的类。比如Spring 的AOP机制。
JDK的动态代理
Java的反射类库中有相关的API,可以通过API构建代理对象。即InvocationHandler接口和Proxy类。下面上代码。
运行结果:
通过结果可以看到,动态代理和静态代理一样实现了对目标功能的增强。
动态代理实现步骤:
1 写一个实现InvocationHandler接口的代理对象Handler,实现类里重写的invoke方法。在invoke里可以在目标类方法前后增加代码进行验证/写入日志等,实现了AOP的思想。
2.创建目标对象
3.创建代理对象Handler
4.利用Proxy的newProxyInstance方法创建代理对象,参数分别填目标对象的classloader,目标对象的接口集合,代理对象Handler。
总结下
动态代理的好处:
1.一个动态代理代理多个接口,接口增加方法,不需要修改代理类。动态代理类不会因为业务的逐渐庞大而庞大;
2.在程序运行到时通过反射创建,才知道要代理哪个类,具有更强的灵活性。
缺点:
1.只能对接口代理,对类的代理需要第三方的CLIGB类库
2.反射创建导致性能相对于静态代理稍低
其他
1.Spring的AOP就是基于JDK代理和CLIGB类库代理两种动态代理实现的,实现在业务逻辑前后统一进行 日志/权限/事务 等等的操作。
2.如果需要代理的方法单一,比如多种的接口方法都需要加日志。这个时候动态代理比较好;如果多种的接口每种需要加不同的操作,这个时候还不如使用静态代理。
3.CLIGB类库代理不在此详细展开。原理实际上是动态生成被代理类的子类字节码