代理模式:Proxy Pattern、结构型设计模式
代理模式是为其他对象提供一种代理,以控制对这个对象的访问。
代理模式核心在于 在客户端和目标对象之间起到中介的作用
代理模式应用场景
1、生活中的 房产 中介 快递 等
2、事物、切面日志、分库分表多个数据源 等
JDK动态代理
1、实现 InvocationHandler 接口
2、通过 字节码重组 ,重新生成对象来替代原生对象
3、获取代理对象引用,并反射获取所有接口
4、JDK动态代理生成一个新类,新的类实现被代理类所有接口
5、生成java代码,编译 .class 文件,加载到JVM中
ps:在ClassPath下只要以$开头的 .class 文件,一般都是自动生成的。
CgLib动态代理
1、实现 MethodInterceptor 接口的 intercept 方法
2、代理的目标对象不需要实现任何接口,通过动态继承目标对象实现动态代理
3、代理效率比JDK代理高,采用 FastClass 机制
4、FastClass:代理类和被代理类各生成一个对象,分配一个index,这个index作为入参直接进行调用,省去反射
5、生成java代码,编译 .class 文件,加载到JVM中
代理模式的优缺点
优点:
1、代理模式能将代理对象与真实调用目标对象进行分离
2、在一定程度上降低了系统的耦合性,增加系统扩展性
3、起到保护目标对象、增强目标对象的作用
缺点:
1、增加系统复杂度,增加类的数量
2、在客户端和目标对象中增加一个代理对象,可能会导致请求速度变
Spring代理模式源码应用
1、JdkDynamicAopProxy CglibAopProxy
2、当 Bean 有实现接口时,Spring会用JDK动态代理。
3、当 Bean 没有实现接口时,Spring会选CgLib代理。
4、在Spring中可以通过配置文件配置使用CgLib代理。