代理设计模式
代理设计模式主要对我们的方法前后实现增强
应用场景
1.打印日志
2.AOP
3.事务 Aop
4.Mybatis中 mapper接口
5.全局捕获异常
6.Lcn、seata、分表分框架shadingjdbc 代理数据源
7.自定义注解生效(反射技术+Aop)
8.Rpc远程调用技术 代理设计模式
代理类优缺点
优点: 实现扩展功能,对我们方法实现增强、安全性、冗余性提高代码复用机制。
缺点: 生成非常多代理的class文件
代理设计模式的分类
静态代理与动态代理
静态代理实现的方式:基于接口实现(JavaJdk动态代理)和继承模式(Cglib)
静态代理模式缺陷:需要人工的手写代理类
动态代理方式:采用程序动态生成代理,不需要程序猿人工手写代理类
动态代理实现方式:Jdk动态代理模式和CGLIB动态代理
Spring中如何运用Jdk动态代理和Cglib呢(下次可)
买房 中介 卖方
被代理类 卖方人
Jdk动态代理模式底层实现
Jdk动态生成的代理类 $Proxy0
注意:$Proxy0基于接口的方式实现,不能转换为子类。
Java的反射机制是无法获取方法的参数名称,只可以获取方法的参数类型。
手写JavaJdk动态代理实现思路:
1.根据接口的信息动态拼接代理类的源代码 P r o x y . j a v a 2. Proxy.java 2. Proxy.java2.Proxy.java编译为 P r o x y . c l a s s 3. 基于类加载器动态读取 Proxy.class 3.基于类加载器动态读取 Proxy.class3.基于类加载器动态读取Proxy.class到内存中
动态代理模式
Jdk动态动态代理 走回调拦截 实现接口接口生成带了类 使用反射技术执行我们的目标方法
1.拼接java源代码
2.编译为class文件
3.读取去class文件到内存中
采用java的反射机制执行目标方法
Cglib动态代理 采用继承的模式生成代理类 底层基于Asm字节码技术实现生成
代理类
1.生成class文件
2.读取去class文件到内存中
采用fastClass 索引的机制执行我们的目标方法
Cglib的效率比Jdk动态代理效率要高
Jdk动态代理
CGLIB动态代理
Spring中是如何综合使用Cglib和Jdk动态代理呢
1.如果被代理类有实现接口的情况下默认采用 Jdk动态代理 可以转换为Cglib
2.如果被代理类没有实现接口的情况下采用Cglib
根据实际情况综合考虑
Java的反射机制 调用我们目标方法
Fastclass 索引机制对我们目标方法加上索引
原理:使用字节码技术获取当前所有的方法,对每个方法加上一个索引,直接
根据索引调用到目标方法效率是比反射机制要高。
addUser();
addUser(String a)
使用方法名称+参数类型 计算hash值 在根据hash值得出索引
Spring中异步注解失效之谜@Async Java动态代理模式
@Async
注意事项:如果我们的SpringMVC控制类有实现过接口的情况下,该控制类无法
注册到SpringMVC容器中,会导致请求404