ProxyFactory源码流程分析
2021-08-31 本文已影响0人
s1991721
先导
先看两张图
![](https://img.haomeiwen.com/i9261086/5c59e36396a8070f.png)
![](https://img.haomeiwen.com/i9261086/d176e0e2ae8e00c3.png)
设计模式
1、时序图中ProxyCreatorSupport之前的类采用了基本的抽象继承,来配置参数(继承)及赋予能力(实现)
2、DefaultAopProxyFactory为工厂模式,根据ProxyConfig的配置参数决定具体实现
最终的实现类如图
![](https://img.haomeiwen.com/i9261086/333f9cbebaced646.png)
源码版本:spring-aop-5.2.6.RELEASE
流程分析
使用场景描述:
- 通过classloader加载类
- 对加载类的方法执行进行规则过滤
代码实现
![](https://img.haomeiwen.com/i9261086/021055262a2c0da5.png)
拦截逻辑
JdkDynamicAopProxy
![](https://img.haomeiwen.com/i9261086/62e1e38c6c29a505.png)
AopProxyUtils.completeProxiedInterfaces
获取被代理类的接口列表信息
findDefinedEqualsAndHashCodeMethods(proxiedInterfaces)
判断接口是否存在equal、hash方法
Proxy.newProxyInstance(classLoader, proxiedInterfaces, this)
在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现
newProxyInstance,方法有三个参数:
- loader: 用哪个类加载器去加载代理对象
- interfaces:动态代理类需要实现的接口
- h:动态代理方法在执行时,会调用h里面的invoke方法去执行
![](https://img.haomeiwen.com/i9261086/a1600d98f2863d69.png)
触发内部的invoke方法
![](https://img.haomeiwen.com/i9261086/d6514539fa5f693e.png)
由于使用了代理,所以equal、hash方法需要单独处理
method.getDeclaringClass()
获取声明方法的类,如果是DecoratingProxy,则AopProxyUtils.ultimateTargetClass
返回被代理类的类型
advised.opaque
是否能转换成Advised默认false,触发method的类为interface且是Advised的子类,直接invoke
![](https://img.haomeiwen.com/i9261086/0205599552842f13.png)
![](https://img.haomeiwen.com/i9261086/f3f9f319bc06b63f.png)
责任链相关内容:
常见设计模式总结
全面深入OkHttp源码(下)
CglibAopProxy
![](https://img.haomeiwen.com/i9261086/29985c634346df68.png)
创建enhancer增强器
![](https://img.haomeiwen.com/i9261086/06639a5199312550.png)
设置回调
![](https://img.haomeiwen.com/i9261086/e23dc7d8960a5f11.png)
至此所有调用都会触发设置的callback