设计模式-静态代理
静态代理:
UserService
UserClinet 需要被代理的对象
Porxy 代理类
测试Demo
运行结果:
缺点总结:
- 当需要代理 多个类时,由于代理对象要实现与代理对象一致的接口,有两种方式:
- 只为维护一个代理类,但是代理类要实现多个接口,这样就导致代理类过于庞大
- 新建多个代理类,每个代理对象 对应 一个代理类,这样就会产生过多的代理类
- 当接口需要增加,删除,修改方法的时候,代理对象和代理类都要同时修改,不易维护
动态代理
JDK动态代理
- 创建自定义的Handler,需要实现
InvocationHandler
这个接口
- 测试, 调用
java.lang.reflect
中的Proxy
中的newProxyInstance
方法,需要代理类的 ClassLoader ,父类的所有 Interface ,和自己定义的 Handler。
- 运行结果
CGLIB动态代理
创建目标类 TargetClass
实现自定义的 Handler (Intercepter)
- 使用 Enhancer ,传递目标对象,设置Handler ,用Enhancer创 目标类子类 的代理
- 运行结果
总结:
JDK :
缺点: 只能代理接口,因为代理类本身已经 extends 了 Proxy ,而 java 不允许多继承,但允许实现多个接口。
Cglib:
优点: 没有接口也可以实现动态代理,而且采用字节码增强技术,性能也不错
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 到处皆诗境,随时有物华!
评论