ProxyFactory源码流程分析

先导

先看两张图

类关系
调用时许图

设计模式

1、时序图中ProxyCreatorSupport之前的类采用了基本的抽象继承,来配置参数(继承)及赋予能力(实现)

2、DefaultAopProxyFactory为工厂模式,根据ProxyConfig的配置参数决定具体实现

最终的实现类如图

源码版本:spring-aop-5.2.6.RELEASE

流程分析

使用场景描述:

  • 通过classloader加载类
  • 对加载类的方法执行进行规则过滤

代码实现

image.png

拦截逻辑

JdkDynamicAopProxy

AopProxyUtils.completeProxiedInterfaces
获取被代理类的接口列表信息

findDefinedEqualsAndHashCodeMethods(proxiedInterfaces)
判断接口是否存在equal、hash方法

Proxy.newProxyInstance(classLoader, proxiedInterfaces, this)
在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现

newProxyInstance,方法有三个参数:

  • loader: 用哪个类加载器去加载代理对象
  • interfaces:动态代理类需要实现的接口
  • h:动态代理方法在执行时,会调用h里面的invoke方法去执行

java动态代理

触发内部的invoke方法

image.png

由于使用了代理,所以equal、hash方法需要单独处理

method.getDeclaringClass()获取声明方法的类,如果是DecoratingProxy,则AopProxyUtils.ultimateTargetClass返回被代理类的类型

advised.opaque是否能转换成Advised默认false,触发method的类为interface且是Advised的子类,直接invoke

责任链相关内容:
常见设计模式总结
全面深入OkHttp源码(下)

CglibAopProxy

创建enhancer增强器

设置回调

至此所有调用都会触发设置的callback

你可能感兴趣的:(ProxyFactory源码流程分析)