目录
一、代理模式的定义与类型
- 一、代理模式的定义与类型
- 二、代理模式的适用场景
- 三、代理模式的优点
- 四、代理模式的缺点
- 五、代理模式的扩展
- 六、Spring的代理选择
- 七、 CGLib代理和jdk的动态代理的速度对比
- 八、代理模式的相关设计模式
1、定义
- 为其他对象提供一种代理,以控制对这个对象的访问
- 代理对象在客户端和目标对象之间起到中介的作用
2、类型
- 结构型
- 保护目标对象
- 增强目标对象
- 代理模式能将代理对象与真实被调用的目标对象分离
- 一定程度上降低了系统的耦合度,扩展性好
- 保护目标对象
- 增强目标对象
- 代理模式会造成系统设计中类的数目增加
- 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
- 增加系统的复杂度
- 静态代理 jdk中的静态代理在代码中显示的定义了一个业务实现类的一个代理,在代理类中对同名的业务方法进行包装,用户通过调用代理类的被包装过的业务方法来调用目标对象的业务方法,同时对目标对象的业务方法进行增强
- 动态代理 1、 jdk中的动态代理通过接口中的方法名在动态生成的代理类中调用业务实现类的同名方法 2、动态代理无法代理类,但是可以代理接口
- CGLib代理 1、CGLib代理可以代理类,是针对类实现进行代理; 2、实现原理是如果代理一个类,CGLib会生成一个代理类的子类覆盖其中的方法,也就是说通过继承还有重写实现 3、如果这个类是final的,这个类无法被继承;如果这类不是final的,里面的方法是final的,name这个方法也是无法被重写的,所以使用CGLib代理的时候,对final修饰符要格外关注
- 当Bean有实现接口时,Spring就会用JDK的动态代理
- 当Bean没有实现接口时,Spring使用CGLib
- 可以强制使用Cglib 在spring配置文件中加入以下代码
-
CGLib代理: CGLib底层采用asm字节码生成的,比使用java反射的效率要高,但是一旦使用CGLib的时候,一定要对final修饰符格外关注
-
jdk的动态代理 jdk原生的代理实现
-
CGLib代理和jdk的动态代理速度对比 在万次执行的情况下,jdk7和jdk8的动态代理性能要比CGLib代理快20%左右
- 代理模式和装饰者模式
- 代理模式和适配器模式