一种设计模式,提供对目标对象的另外一种访问方式,通过代理对象访问目标对象
1.静态代理
代理类和目标类共同实现同一个接口
实现例子:
接口:
代理类:
目标类:
测试类:
2.动态代理 :基于jdk的动态代理和基于cglib的动态代理
1.jdk的动态代理(必须有接口)
前后服务不能写入已经写好的代理类里,所以要有个专门写增强逻辑的代码;
代理类不是自己写的,直接拿着代理类去创建对象
例子:测试类:
目标类:
增强规则类:
接口类:
静态代理和jdk动态代理区别:
静态代理:自己手写代理类 Java 文件,编译就存在。接口加新方法,代理类必须手动重写,增强代码分散在各个方法,复用差。直接对象调用,不用反射。
JDK 动态代理:不手写代理类,运行时 JDK 在内存自动生成代理类字节码。只写InvocationHandler,所有方法的增强全部写在invoke()一处;接口新增方法不用改代理代码,复用性强;底层靠反射执行目标方法。
2.基于cglib的代理(不能代理被final实现的类或方法)
原理:通过继承在继承目标方法的基础上实现更多的逻辑
例子:
CGLIB拦截回调类 CallbackMethod
jdk和cglib动态代理区别:
jdk动态:1.代理对象实现目标接口类 2.原生jdk,无需额外包 3.必须有接口
cglib动态:1.代理对象是目标类的子类 2.需要第三方cglib asm 3.不需要接口,不能代理final类/final方法