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