什么是代理模式
核心点:就是对我们的方法前后实现增强
代理模式整个应用场景
- 打印日志
- Rpc的远程调用框架
- Mybatis mapper
- Aop
- 事务
- 自定义注解
- 分布式事务全局id lcn seata 生成一个全局的事务id
- SpringBoot全局捕获异常
代理模式优点
减少代码冗余,提高代码复用性,安全性 隐藏真实角色、非侵入
代理实现方式分类
静态代理与动态代理
静态代理:也需要开发者自己编写代理类
静态的实现方式:1.实现接口(Jdk实现)2通过继承模式(Cglib)
动态代理设计需要写代理,统一采用程序生成
静态代理模式缺陷
需要每次人工编写代理类对象,代码非常冗余
动态代理模式
Jdk动态代理 采用实现接口模式实现增强
CGLIB动态代理 采用继承模式实现增强
最大优势 不需要些代理类对象通过程序生成
Jdk动态代理实现方式 invocationhandler接口重写invoke方式实现回调形式实现
增强。拦截方式
Exception in thread "main" java.lang.ClassCastException:
com.sun.proxy.$Proxy0 cannot be cast to com.mayikt.service.impl.OrderServiceImpl
at com.mayikt.service.Test002.main(Test002.java:17)
Jdk动态代理生成的$Proxy0类可以强制成接口类型,但是不能强制实现。
以$Proxy开头
Jdk动态代理基于接口的形式实现代理
手写JavaJdk动态代理设计模式思路
动态代理设计模式的核心:
生成代理类对象的思想:
- 使用java反射机制获取当前接口的信息 javase反射机制
- 拼接java代码,将java代码写入在本地文件
- 将java代码编译为class文件
- 程序直接读取该class文件到内存中即可。
- 1.使用java反射机制拼接$Proxy.java类的源代码
-
2.需要将$Proxy.java编译成$Proxy.class
3.程序中直接读取该class文件到内存中
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)