代理的作用:提供代理加强对一个对象的访问
jdk动态代理的实现原理:
- 拿到被代理类的引用,并获取所有接口信息(反射获取)
- jdk proxy.newInstance生成新的类,实现接口方法
- 动态生成java代码,增强逻辑代码也写入
- 编译java代码生成class文件
- 加载并运行新的class
jdk动态代理调用过程:
- 生成代理对象的编译文件$proxy0.class
- 加载到内存当中 该proxy每个方法调用的其实是调用代理类的invoke方法(输出$proxy0.class可看出调用目标方法其实是调用代理类的方法)-》super.h.invoke(this,m,null) m就是对应的method,h是代理对象
- 返回代理对象供调用
jdk动态代理的实现条件:
- 被代理类必须继承接口,因为代理类需要clazz.getinterfaces()获取方法接口信息以生成代理类
- 生成的代理类的方法为final,无法在被代理重写
cglib调用过程:
- 生成代理对象:a.代理对象会生成每个方法的代理方法 b.调用代理对象的intercept方法
- 调用代理对象的invokesuper方法
- 生成代理类的和被代理类的fastclass(根据index参数调用方法)
- 调用代理类的方法-》调用被代理类的方法
cglib的实现条件:可以实现任何类
jdk动态代理和cglib的区别:
jdk动态代理 | cglib | |
实现条件 | 实现被代理类接口 | 继承被代理类 |
生成效率 | 直接写入class文件 | 基于asm,实现复杂,生成效率低 |
调用效率 | 通过反射调用,过程多 | 基于fastclass调用,调用速率快 |
spring中的配置 | 根据是否有接口 | 可强制使用cglib代理 |
实现方式 | InvocationHandler接口 | 实现MethodInterceptor接口 |
静态代理和动态代理的区别:只能代理某个方法,增加方法需要修改代理类
代理模式的优点:
- 使类符合开闭原则(降低系统耦合度)
- 将被代理对象和真实对象分离
代理模式的缺点:
- 类数量增加
- 增加系统复杂度以及请求速率
总结:鸡汤不知道,我只知道偷懒后的我一直很后悔。