7、DefaultAdvisorAdapterRegistry
这里类里面存在着 MethodBeforeAdviceAdapter, AfterReturningAdviceAdapter, ThrowsAdviceAdapter 这三个类是将 Advice适配成MethodInterceptor的适配类; 而其本身具有两个重要的功能:
1、将 Advice/MethodInterceptor 包裹成 DefaultPointcutAdvisor
2、通过上面的三个适配类将 Advisor 中的 Advice 适配成对应的MethodInterceptor
(PS: 在代理对象执行时, 执行的都是MethodInterceptor, 当然在进行配置时既可以配置 Advice, MethodInterceptor, Advisor均可)
8、AopProxyFactory
这个接口中定义了根据 AdvisedSupport 中配置的信息来生成合适的AopProxy (主要分为 基于Java 动态代理的 JdkDynamicAopProxy 与基于 Cglib 的ObjenesisCglibAopProxy)
9、MethodInvocation
MethodInvocation 是进行 invoke 对应方法 / MethodInterceptor的类。
其主要分成用于 Proxy 的 ReflectiveMethodInvocation, 与用于 Cglib 的 CglibMethodInvocation
(其实就是就是递归的调用 MethodInterceptor, 当没有 MethodInterceptor可以调用时)
10、AbstractAutoProxyCreator
这个类是声明式 Aop 编程中非常重要的一个角色:自动代理创建器
解读如下:
- AbstractAutoProxyCreator继承了 ProxyProcessorSupport, 所以它具有了ProxyConfig中动态代理应该具有的配置属性
- AbstractAutoProxyCreator 实现了 SmartInstantiationAwareBeanPostProcessor(包括实例化的前后置函数, 初始化的前后置函数) 并进行了实现
- 实现了 创建代理类的主方法 createProxy 方法
定义了抽象方法 getAdvicesAndAdvisorsForBean**(获取 Bean对应的 Advisor)**
- AbstractAutoProxyCreator 中等于是构建了创建 Aop 对象的主逻辑**(模版)**,而其子类 AbstractAdvisorAutoProxyCreator 实现了getAdvicesAndAdvisorsForBean 方法, 并且通过工具类 BeanFactoryAdvisorRetrievalHelper(PS: 它的方法findAdvisorBeans中实现类获取容器中所有 Advisor 的方法) 来获取其对应的 Advisor。它的主要子类如下:
- AspectJAwareAdvisorAutoProxyCreator: 通过解析 aop 命名空间的配置信息时生成的 AdvisorAutoProxyCreator, 主要通过ConfigBeanDefinitionParser.parse() -> ConfigBeanDefinitionParser.configureAutoProxyCreator() -> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary() -> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(); 与之对应的 Pointcut 是AspectJExpressionPointcut, Advisor 是 AspectJPointcutAdvisor, Advice 则是 AspectJAfterAdvice, AspectJAfterReturningAdvice, AspectJAfterThrowingAdvice, AspectJAroundAdvice
- AnnotationAwareAspectJAutoProxyCreator: 这是基于 @AspectJ注解生成的 切面类的一个 AbstractAutoProxyCreator, 解析额工作交给了 AspectJAutoProxyBeanDefinitionParser, 步骤如下AspectJAutoProxyBeanDefinitionParser.parse() -> AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary() -> AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary()
- DefaultAdvisorAutoProxyCreator: 这个类也是 AbstractAutoProxyCreator的子类, 它帅选作用的类时主要是根据其中的 advisorBeanNamePrefix(类名前缀)配置进行判断
- BeanNameAutoProxyCreator: 通过类的名字来判断是否作用(正则匹配)
上面这几个类主要是声明式 Aop 编程的主要功能类
总结
本篇主要介绍了 Spring-Aop 中的主要构建组件, 并进行相应的说明, 单纯的讲 aop 这个概念其实不复杂,,但在Spring这个产品中,就显得很复杂了。主要体现在如下方面:
- 涉及的组件多 -> Pointcut, Advice, MethodInterceptor, Advised, Advisor, TargetSource, AopProxyFactory, MethodInvocation, AbstractAutoProxyCreator, 这也造成掌握 Spring-aop 的难度
- 实现aop需要多个基础功能的支持(AspectJ中的注解及注解解析, Cglib, java中的 Proxy, Asm字节码(主要式解析方法中的参数名))
- 结合了 BeanPostProcessor 在Bean的实例化/初始化阶段就进行生成对应的代理类(比如 AspectJAwareAdvisorAutoProxyCreator与AnnotationAwareAspectJAutoProxyCreator)
总体而言,Spring AOP是众多技术的一个综合,若要要彻底了解和运用自如,相关的周边技术能力必不可少。因此我平时书说的,基础不牢,地动山摇,在这里的学习过程中会有所体会~~~