> [TOC] ## Spring AOP API 设计与实现 ### Spring AOP API 整体设计 - Join point - `Joinpoint` - Pointcut - `Pointcut` - Advice 执行动作 - `Advice` - Advice 容器 - `Advisor` - Introduction - `IntroductionInfo` - 代理对象创建基础类 - `ProxyCreatorSupport` - 代理工厂 - `ProxyFactory` 、`ProxyFactoryBean` - `AopProxyFactory` 配置管理器 - `AdvisedSupport` - IoC 容器自动代理抽象 - `AbstractAutoProxyCreator` ### 接入点接口 - Joinpoint - Interceptor 执行上下文 - Invocation - 方法拦截器执行上下文 - `MethodInvocation` - 构造器拦截器执行上下文 - `ConstructorInvocation` - MethodInvocation 实现 - 基于反射 - `ReflectiveMethodInvocation` - 基于 CGLIB - `CglibMethodInvocation` ![img](assets/o_210917031338Joinpoint.png) ### Joinpoint 条件接口 - Pointcut 核心组件: - 类过滤器 - `ClassFilter` - 方法匹配器 - `MethodMatcher` ![img](assets/o_210917053407Pointcut.png) #### Pointcut 操作 - 组合实现 - `org.springframework.aop.support.ComposablePointcut` - 工具类 - `ClassFilter` 工具类 - `ClassFilters` - `MethodMatcher` 工具类 - `MethodMatchers` - `Pointcut` 工具类 - `Pointcuts` #### Pointcut 便利实现 - 静态 `Pointcut` - `StaticMethodMatcherPointcut` - 正则表达式 `Pointcut` - `JdkRegexpMethodPointcut` - 控制流 `Pointcut` - `ControlFlowPointcut` #### Pointcut AspectJ 实现 - 实现类 - `org.springframework.aop.aspectj.AspectJExpressionPointcut` - 指令支持 - `SUPPORTED_PRIMITIVES` 字段 - 表达式 - `org.aspectj.weaver.tools.PointcutExpression` ### Joinpoint 执行动作接口 - Advice ![img](assets/o_210917074048Advice.png) - Around Advice - Interceptor - 方法拦截器 - `MethodInterceptor` - 构造器拦截器 - `ConstructorInterceptor` - 前置动作 - 标准接口 - `org.springframework.aop.BeforeAdvice` - 方法级别 - `org.springframework.aop.MethodBeforeAdvice` - 后置动作 - `org.springframework.aop.AfterAdvice` - `org.springframework.aop.AfterReturningAdvice` - `org.springframework.aop.ThrowsAdvice` #### Joinpoint Before Advice 标准实现 ![img](assets/o_210917083751BeforeAdvice.png) 接口: - 标准接口 - `org.springframework.aop.BeforeAdvice` - 方法级别 - `org.springframework.aop.MethodBeforeAdvice` 实现: - `org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor` #### Joinpoint Before Advice AspectJ 实现 - 实现类 - `org.springframework.aop.aspectj.AspectJMethodBeforeAdvice` #### Joinpoint After Advice 标准实现 ![img](assets/o_210918015501AfterAdvice.png) - 接口 - `org.springframework.aop.AfterAdvice` - `org.springframework.aop.AfterReturningAdvice` - `org.springframework.aop.ThrowsAdvice` - 实现 - `org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor` - `org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor` #### Joinpoint After Advice AspectJ 实现 - 接口 - `org.springframework.aop.AfterAdvice` - `org.springframework.aop.AfterReturningAdvice` - `org.springframework.aop.ThrowsAdvice` - 实现 - `org.springframework.aop.aspectj.AspectJAfterAdvice` - `org.springframework.aop.aspectj.AspectJAfterReturningAdvice` - `org.springframework.aop.aspectj.AspectJAfterThrowingAdvice` ### Advice 容器接口 - Advisor ![img](assets/o_210918031801Advisor.png) - 接口 - org.springframework.aop.Advisor - PointcutAdvisor - 通用实现 - `org.springframework.aop.support.DefaultPointcutAdvisor` - `IntroductionAdvisor` #### Pointcut 与 Advice 连接器 - PointcutAdvisor - 接口 - org.springframework.aop.PointcutAdvisor - 通用实现 - `org.springframework.aop.support.DefaultPointcutAdvisor` - AspectJ 实现 - `org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor` - `org.springframework.aop.aspectj.AspectJPointcutAdvisor` - 静态方法实现 - `org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor` - IoC 容器实现 - `org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor` ### Introduction 与 Advice 连接器 - IntroductionAdvisor ![img](assets/o_210918032025Introduction.png) - 接口 - org.springframework.aop.IntroductionAdvisor - 元信息 - `org.springframework.aop.IntroductionInfo` - 通用实现 - `org.springframework.aop.support.DefaultIntroductionAdvisor` - AspectJ 实现 - `org.springframework.aop.aspectj.DeclareParentsAdvisor` ### Advisor 的 Interceptor 适配器 - AdvisorAdapter ![img](assets/o_210918032927AdvisorAdapter.png) - 接口 - org.springframework.aop.framework.adapter.AdvisorAdapter - MethodBeforeAdvice实现 - `org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter` - AfterReturningAdvice实现 - `org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter` - ThrowsAdvice 实现 - `org.springframework.aop.framework.adapter.ThrowsAdviceAdapter` ### AOP 代理接口 - AopProxy ![img](assets/o_210918052609AopProxy.png) - 接口 - `org.springframework.aop.framework.AopProxy` - 实现 - JDK 动态代理 - `org.springframework.aop.framework.JdkDynamicAopProxy` - CGLIB 字节码提升 - `org.springframework.aop.framework.CglibAopProxy` - `org.springframework.aop.framework.ObjenesisCglibAopProxy` #### AopProxy 工厂接口与实现 ![img](assets/o_210918053303AopProxy.png) - 接口 - `org.springframework.aop.framework.AopProxyFactory` - 默认实现:org.springframework.aop.framework.DefaultAopProxyFactory - 返回类型 - `org.springframework.aop.framework.JdkDynamicAopProxy` - `org.springframework.aop.framework.CglibAopProxy` - `org.springframework.aop.framework.ObjenesisCglibAopProxy` #### JDK AopProxy 实现 - JdkDynamicAopProxy - 实现 - org.springframework.aop.framework.JdkDynamicAopProxy - 配置 - `org.springframework.aop.framework.AdvisedSupport` - 来源 - `org.springframework.aop.framework.DefaultAopProxyFactory` #### CGLIB AopProxy 实现 - CglibAopProxy - 实现 - org.springframework.aop.framework.CglibAopProxy - 配置 - `org.springframework.aop.framework.AdvisedSupport` - 来源 - `org.springframework.aop.framework.DefaultAopProxyFactory` #### AopProxyFactory 配置管理器 - AdvisedSupport - 核心 API - org.springframework.aop.framework.AdvisedSupport - 语义 - 代理配置 - 基类 - `org.springframework.aop.framework.ProxyConfig` - 实现接口 - `org.springframework.aop.framework.Advised` - 使用场景 - `org.springframework.aop.framework.AopProxy` 实现 ### Advisor 链工厂接口与实现 - AdvisorChainFactory - 核心 API - org.springframework.aop.framework.AdvisorChainFactory - 默认实现 - `org.springframework.aop.framework.DefaultAdvisorChainFactory` - 返回类型 - `org.springframework.aop.framework.InterceptorAndDynamicMethodMatcher` - `org.aopalliance.intercept.Interceptor` ### 目标对象来源接口与实现 - TargetSource ![img](assets/o_210918054107TargetSource.png) - 核心 API - org.springframework.aop.TargetSource - 实现 - `org.springframework.aop.target.HotSwappableTargetSource` - `org.springframework.aop.target.AbstractPoolingTargetSource` - `org.springframework.aop.target.PrototypeTargetSource` - `org.springframework.aop.target.ThreadLocalTargetSource` - `org.springframework.aop.target.SingletonTargetSource` ### 代理对象创建基础类 - ProxyCreatorSupport ![img](assets/o_210918055439ProxyCreatorSupport.png) - 核心 API - org.springframework.aop.framework.ProxyCreatorSupport - 语义 - 代理对象创建基类 - 基类 - `org.springframework.aop.framework.AdvisedSupport` #### ProxyCreatorSupport 标准实现 - ProxyFactory - 核心 API - org.springframework.aop.framework.ProxyFactory - 基类 - `org.springframework.aop.framework.ProxyCreatorSupport` - 特性增强 - 提供一些便利操作 #### ProxyCreatorSupport IoC 容器实现 - ProxyFactoryBean - 核心 API - org.springframework.aop.framework.ProxyFactoryBean - 基类 - `org.springframework.aop.framework.ProxyCreatorSupport` - 特点 - Spring IoC 容器整合 - `org.springframework.beans.factory.BeanClassLoaderAware` - `org.springframework.beans.factory.BeanFactoryAware` - 特性增强 - 实现 `org.springframework.beans.factory.FactoryBean` #### ProxyCreatorSupport AspectJ 实现 - AspectJProxyFactory - 核心 API - org.springframework.aop.aspectj.annotation.AspectJProxyFactory - 基类 - `org.springframework.aop.framework.ProxyCreatorSupport` - 特点 - AspectJ 注解整合 - 相关 API - AspectJ 元数据 - `org.springframework.aop.aspectj.annotation.AspectMetadata` - AspectJ Advisor 工厂 - `org.springframework.aop.aspectj.annotation.AspectJAdvisorFactory` ### AdvisedSupport 事件监听器 - AdvisedSupportListener - 核心 API - org.springframework.aop.framework.AdvisedSupportListener - 事件对象 - `org.springframework.aop.framework.AdvisedSupport` - 事件来源 - `org.springframework.aop.framework.ProxyCreatorSupport` - 激活事件触发 - `ProxyCreatorSupport#createAopProxy` - 变更事件触发 - 代理接口变化时、 Advisor 变化时、配置复制 ### IoC 容器自动代理抽象 - AbstractAutoProxyCreator ![img](assets/o_210930065937ProxyConfig.png) - API - org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator - 基类 - `org.springframework.aop.framework.ProxyProcessorSupport` - 特点 - 与 Spring Bean 生命周期整合 - `org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor` #### IoC 容器自动代理标准实现 - AbstractAutoProxyCreator - 基类 - org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator - 默认实现 - `DefaultAdvisorAutoProxyCreator` - Bean 名称匹配实现 - `BeanNameAutoProxyCreator` - Infrastructure Bean 实现 - `InfrastructureAdvisorAutoProxyCreator` #### IoC 容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator - org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator - 基类 - `org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator` ### AOP Infrastructure Bean 接口 - AopInfrastructureBean - 接口 - org.springframework.aop.framework.AopInfrastructureBean - 语义 - Spring AOP 基础 Bean 标记接口 - 实现 - `org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator` - `org.springframework.aop.scope.ScopedProxyFactoryBean` - 判断逻辑 - `AbstractAutoProxyCreator#isInfrastructureClass` - `ConfigurationClassUtils#checkConfigurationClassCandidate` ### AOP 上下文辅助类 - AopContext - API - org.springframework.aop.framework.AopContext - 语义 - `ThreadLocal` 的扩展,临时存储 AOP 对象 ### AOP 代理工具类 - AopProxyUtils - API - org.springframework.aop.framework.AopProxyUtils - 代表方法 - `getSingletonTarget` - 从实例中获取单例对象 - `ultimateTargetClass` - 从实例中获取最终目标类 - `completeProxiedInterfaces` - 计算 `AdvisedSupport` 配置中所有被代理的接口 - `proxiedUserInterfaces` - 从代理对象中获取代理接口 - `isAopProxy` - 判断对象是否为代理对象 - `isJdkDynamicProxy` - 判断对象是否为 JDK 动态代理对象 - `isCglibProxy` - 判断对象是否为 CGLIB 代理对象 - `getTargetClass` - 从对象中获取目标类型 - `invokeJoinpointUsingReflection` - 使用 Java 反射调用 Joinpoint(目标方法) ### AspectJ Enable 模块驱动实现 - EnableAspectJAutoProxy - 注解 - `org.springframework.context.annotation.EnableAspectJAutoProxy` - 属性方法 - `proxyTargetClass` - 是否已类型代理 - `exposeProxy` - 是否将代理对象暴露在 `AopContext` 中 - 设计模式 - @Enable 模块驱动 - `ImportBeanDefinitionRegistrar` 实现 - `org.springframework.context.annotation.AspectJAutoProxyRegistrar` - 底层实现 - `org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator` ### AspectJ XML 配置驱动实现 - `` - XML 元素 - - 属性 - `proxy-target-class` - 是否已类型代理 - `expose-proxy` - 是否将代理对象暴露在 `AopContext` 中 - 设计模式 - Extensible XML Authoring - 底层实现 - `org.springframework.aop.config.AspectJAutoProxyBeanDefinitionParser` #### AOP 配置 Schema-based 实现 - `` 、`` - XML 元素 - - 属性 - `proxy-target-class` - 是否已类型代理 - `expose-proxy` - 是否将代理对象暴露在 `AopContext` 中 - 嵌套元素 - `pointcut` - `advisor` - `aspect` - 底层实现 - `org.springframework.aop.config.ConfigBeanDefinitionParser` - XML 元素 - - 父元素 - `` - 属性 - `ref` - Spring Bean 引用的名称 - `order` - Aspect 顺序数 - 嵌套元素 - `pointcut` - `declare-parents` - `before` - `after` - `after-returning` - `after-throwing` - `around` #### Pointcut Schema-based 实现 - `` - XML 元素 - - 父元素 - `` 或 `` - 属性 - `id` - Pointcut ID - `expression` - (必须)AspectJ 表达式 - 底层实现 - `org.springframework.aop.Pointcut` #### Around Advice Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - 引用的 AspectJ Pointcut 名称 - `method` - 拦截目标方法 - `arg-names` - 目标方法参数名称 #### Before Advice Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - 引用的 AspectJ Pointcut 名称 - `method` - 拦截目标方法 - `arg-names` - 目标方法参数名称 #### After Advice Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - 引用的 AspectJ Pointcut 名称 - `method` - 拦截目标方法 - `arg-names` - 目标方法参数名称 #### After Returning Advice Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - 引用的 AspectJ Pointcut 名称 - `method` - 拦截目标方法 - `arg-names` - 目标方法参数名称 - `returning` - 方法参数名称 #### After Throwing Advice Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - 引用的 AspectJ Pointcut 名称 - `method` - 拦截目标方法 - `arg-names` - 目标方法参数名称 - `throwing` - 方法参数名称 #### Adviser Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `advice-ref` - Advice Bean 引用 - `pointcut` - AspectJ Pointcut 表达式 - `pointcut-ref` - AspectJ Pointcut Bean 引用 - `order` - Advisor 顺序数 #### Introduction Schema-based 实现 - `` - XML 元素 - - 父元素 - `` - 属性 - `types-matching` - 是否已类型代理 - `implement-interface` - 实现接口全类名 - `default-impl` - 默认实现全类名 - `delegate-ref` - 委派实现 Bean 引用 #### 作用域代理 Schema-based 实现 - `` - XML 元素 - `` - 属性 - `proxy-target-class` - 是否已类型代理