20210916 小马哥讲 Spring AOP

环境信息

Maven 依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>

思维导图

img

Spring AOP 总览

AOP 引入

Java OOP 存在哪些局限性?

  • 静态化语言:类结构一旦定义,不容易被修改
  • 侵入性扩展:通过继承和组合组织新的类结构

AOP 常见使用场景

  • 日志场景
  • 诊断上下文,如:Log4j 或 Logback 中的 _x0008_MDC
  • 辅助信息,如:方法执行时间
  • 统计场景
    • 方法调用次数
    • 执行异常次数
    • 数据抽样
    • 数值累加
  • 统计场景
    • 方法调用次数
    • 执行异常次数
    • 数据抽样
    • 数值累加
  • 性能场景
    • 缓存,如 Spring Cache
    • 超时控制

Java AOP 设计模式

  • 代理模式:静态和动态代理
  • 判断模式:类、方法、注解、参数、异常...
  • 拦截模式:前置、后置、返回、异常

Java AOP 代理模式(Proxy)

  • Java 静态代理
    • 常用 OOP 继承和组合相结合
  • Java 动态代理
    • JDK 动态代理
    • 字节码提升,如 CGLIB

Java AOP 判断模式(Predicate)

判断来源

  • 类型(Class)
  • 方法(Method)
  • 注解(Annotation)
  • 参数(Parameter)
  • 异常(Exception)

Java AOP 拦截器模式(Interceptor)

拦截类型:

  • 前置拦截(Before)
  • 后置拦截(After)
  • 异常拦截(Exception)

Spring AOP 功能概述

核心特性:

  • 纯 Java 实现、无编译时特殊处理、不修改和控制 ClassLoader
  • 仅支持方法级别的 Join Points
  • 非完整 AOP 实现框架
  • Spring IoC 容器整合
  • AspectJ 注解驱动整合(非竞争关系)

Spring AOP 编程模型

注解驱动

  • 实现:Enable 模块驱动,@EnableAspectJAutoProxy
  • 注解:
    • 激活 AspectJ 自动代理:@EnableAspectJAutoProxy
    • Aspect : @Aspect
    • Pointcut :@Pointcut
    • Advice :@Before@AfterReturning@AfterThrowing@After@Around
    • Introduction :@DeclareParents

XML 配置驱动

  • 实现:Spring Extendable XML Authoring
  • XML 元素
    • 激活 AspectJ 自动代理:<aop:aspectj-autoproxy/>
    • 配置:<aop:config/>
    • Aspect : <aop:aspect/>
    • Pointcut :<aop:pointcut/>
    • Advice :<aop:around/><aop:before/><aop:after-returning/><aop:after-throwing/><aop:after/>
    • Introduction :<aop:declare-parents/>
    • 代理 Scope : <aop:scoped-proxy/>

底层 API

  • 实现:JDK 动态代理、CGLIB 以及 AspectJ
  • API:
    • 代理:AopProxy
    • 配置:ProxyConfig
    • Join Point:Joinpoint
    • Pointcut :Pointcut
    • Advice :AdviceBeforeAdviceAfterAdviceAfterReturningAdviceThrowsAdvice

Spring AOP Advice 类型

Advice 类型:

  • 环绕(Around)
  • 前置(Before)
  • 后置(After)
    • 方法执行
    • finally 执行
  • 异常(Exception)

Spring AOP 代理实现

  • JDK 动态代理实现 - 基于接口代理
  • CGLIB 动态代理实现 - 基于类代理(字节码提升)
  • AspectJ 适配实现

Spring AOP 基础

@AspectJ 注解驱动

  • 激活 @AspectJ 模块
    • 注解激活 - @EnableAspectJAutoProxy
    • XML 配置 - <aop:aspectj-autoproxy/>
  • 声明 Aspect
    • @Aspect

Spring AOP API 设计与实现

Spring AOP API 整体设计

  • Join point - Joinpoint
  • Pointcut - Pointcut
  • Advice 执行动作 - Advice
  • Advice 容器 - Advisor
  • Introduction - IntroductionInfo
  • 代理对象创建基础类 - ProxyCreatorSupport
  • 代理工厂 - ProxyFactoryProxyFactoryBean
  • AopProxyFactory 配置管理器 - AdvisedSupport
  • IoC 容器自动代理抽象 - AbstractAutoProxyCreator

接入点接口 - Joinpoint

  • Interceptor 执行上下文 - Invocation
    • 方法拦截器执行上下文 - MethodInvocation
    • 构造器拦截器执行上下文 - ConstructorInvocation
  • MethodInvocation 实现
    • 基于反射 - ReflectiveMethodInvocation
    • 基于 CGLIB - CglibMethodInvocation

img

Joinpoint 条件接口 - Pointcut

核心组件:

  • 类过滤器 - ClassFilter
  • 方法匹配器 - MethodMatcher

img

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

  • 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

接口:

  • 标准接口 - 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

  • 接口
    • 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

  • 接口 - 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

  • 接口 - org.springframework.aop.IntroductionAdvisor
    • 元信息
      • org.springframework.aop.IntroductionInfo
    • 通用实现
      • org.springframework.aop.support.DefaultIntroductionAdvisor
    • AspectJ 实现
      • org.springframework.aop.aspectj.DeclareParentsAdvisor

Advisor 的 Interceptor 适配器 - AdvisorAdapter

img

  • 接口 - 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

  • 接口 - org.springframework.aop.framework.AopProxy
  • 实现
    • JDK 动态代理
      • org.springframework.aop.framework.JdkDynamicAopProxy
    • CGLIB 字节码提升
      • org.springframework.aop.framework.CglibAopProxy
      • org.springframework.aop.framework.ObjenesisCglibAopProxy

AopProxy 工厂接口与实现

img

  • 接口 - 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

  • 核心 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

  • 核心 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

  • 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 配置驱动实现 - <aop:aspectj-autoproxy/>

  • XML 元素 - <aop:aspectj-autoproxy/>
    • 属性
      • proxy-target-class - 是否已类型代理
      • expose-proxy - 是否将代理对象暴露在 AopContext
    • 设计模式 - Extensible XML Authoring
    • 底层实现
      • org.springframework.aop.config.AspectJAutoProxyBeanDefinitionParser

AOP 配置 Schema-based 实现 - <aop:config/><aop:aspect/>

  • XML 元素 - <aop:config/>
    • 属性
      • proxy-target-class - 是否已类型代理
      • expose-proxy - 是否将代理对象暴露在 AopContext
    • 嵌套元素
      • pointcut
      • advisor
      • aspect
    • 底层实现
      • org.springframework.aop.config.ConfigBeanDefinitionParser
  • XML 元素 - <aop:aspect/>
    • 父元素 - <aop:config/>
    • 属性
      • ref - Spring Bean 引用的名称
      • order - Aspect 顺序数
    • 嵌套元素
      • pointcut
      • declare-parents
      • before
      • after
      • after-returning
      • after-throwing
      • around

Pointcut Schema-based 实现 - <aop:pointcut/>

  • XML 元素 - <aop:pointcut/>
    • 父元素 - <aop:aspect/><aop:config/>
    • 属性
      • id - Pointcut ID
      • expression - (必须)AspectJ 表达式
    • 底层实现
      • org.springframework.aop.Pointcut

Around Advice Schema-based 实现 - <aop:around/>

  • XML 元素 - <aop:around/>
    • 父元素 - <aop:aspect/>
    • 属性
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - 引用的 AspectJ Pointcut 名称
      • method - 拦截目标方法
      • arg-names - 目标方法参数名称

Before Advice Schema-based 实现 - <aop:before/>

  • XML 元素 - <aop:before/>
    • 父元素 - <aop:aspect/>
    • 属性
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - 引用的 AspectJ Pointcut 名称
      • method - 拦截目标方法
      • arg-names - 目标方法参数名称

After Advice Schema-based 实现 - <aop:after/>

  • XML 元素 - <aop:after/>
    • 父元素 - <aop:aspect/>
    • 属性
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - 引用的 AspectJ Pointcut 名称
      • method - 拦截目标方法
      • arg-names - 目标方法参数名称

After Returning Advice Schema-based 实现 - <aop:after-returning/>

  • XML 元素 - <aop:after-returning/>
    • 父元素 - <aop:aspect/>
    • 属性
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - 引用的 AspectJ Pointcut 名称
      • method - 拦截目标方法
      • arg-names - 目标方法参数名称
      • returning - 方法参数名称

After Throwing Advice Schema-based 实现 - <aop:after-throwing/>

  • XML 元素 - <aop:after-throwing/>
    • 父元素 - <aop:aspect/>
    • 属性
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - 引用的 AspectJ Pointcut 名称
      • method - 拦截目标方法
      • arg-names - 目标方法参数名称
      • throwing - 方法参数名称

Adviser Schema-based 实现 - <aop:advisor/>

  • XML 元素 - <aop:advisor/>
    • 父元素 - <aop:config/>
    • 属性
      • advice-ref - Advice Bean 引用
      • pointcut - AspectJ Pointcut 表达式
      • pointcut-ref - AspectJ Pointcut Bean 引用
      • order - Advisor 顺序数

Introduction Schema-based 实现 - <aop:declare-parents/>

  • XML 元素 - <aop:declare-parents/>
    • 父元素 - <aop:aspect/>
    • 属性
      • types-matching - 是否已类型代理
      • implement-interface - 实现接口全类名
      • default-impl - 默认实现全类名
      • delegate-ref - 委派实现 Bean 引用

作用域代理 Schema-based 实现 - <aop:scoped-proxy/>

  • XML 元素 - <aop:scoped-proxy/>
  • 属性
    • proxy-target-class - 是否已类型代理

Spring AOP 设计模式

设计模式分类

  • Creational(创建模式):Abstract factory、Builder、Factory method、Prototype、Singleton
  • Structural(结构模式):Adapter、Bridge、Composite、Decorator、Facade、Flyweight、Proxy
  • Behavioral(行为模式):Chain of responsibility、Command、Interpreter、Iterator、Mediator、Memento、Observer、State、Strategy、Template method、Visitor

工厂方法模式(Factory method)实现

  • 基本概念

    就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.framework.ProxyFactory

抽象工厂模式(Abstract factory)实现

  • 基本概念

    抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

  • Spring AOP 举例实现

    • 接口 - org.springframework.aop.framework.AopProxyFactory
    • 实现 - org.springframework.aop.framework.DefaultAopProxyFactory

构建器模式(Builder)实现

  • 基本概念

    建造模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder

原型模式(Prototype)实现

  • 基本概念

    创建型模式的一种,其特点在于通过「复制」一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的「原型」,这个原型是可定制的。

    原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.target.PrototypeTargetSource

单例模式(Singleton)实现

  • 基本概念

    属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.target.SingletonTargetSource

适配器模式(Adapter)实现

  • 基本概念

    有时候也称包装样式或者包装(英語:wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.framework.adapter.AdvisorAdapter
      • 适配对象 - org.aopalliance.aop.Advice
      • 目标对象 - org.aopalliance.intercept.MethodInterceptor

组合模式(Composite)实现

Spring AOP 举例实现

  • 实现 - org.springframework.aop.support.ComposablePointcut
  • 接口 - org.springframework.aop.Pointcut
  • 成员 - org.springframework.aop.Pointcut

装饰器模式(Decorator)实现

  • 基本概念

    一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.aspectj.annotation.LazySingletonAspectInstanceFactoryDecorator

享元模式(Flyweight)实现

  • 基本概念

    它使用物件用来尽可能减少內存使用量;于相似物件中分享尽可能多的信息。当大量物件近乎重复方式存在,因而使用大量內存时,此法适用。通常物件中的部分状态(state)能够共享。常见做法是把它们放在数据结构外部,当需要使用时再将它们传递给享元。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.framework.adapter.AdvisorAdapterRegistry

代理模式(Proxy)实现

  • 基本概念

    所谓的代理者是指一个类别可以作为其它东西的介面。代理者可以作任何东西的界面:网络连接、內存
    中的大物件、档案或其它昂贵或无法复制的资源。

  • Spring AOP 举例实现

    • 实现 - org.springframework.aop.framework.AopProxy
      • JDK - org.springframework.aop.framework.JdkDynamicAopProxy
      • CGLIB - org.springframework.aop.framework.CglibAopProxy

模板方法模式(Template Method)实现

  • 基本概念

    模板方法是一个定义在父类别的方法,在模板方法中会呼叫多个定义在父类别的其他方法,而这些方法有
    可能只是抽象方法并没有实作,模板方法仅决定这些抽象方法的执行顺序,这些抽象方法的实作由子类别
    负责,并且子类别不允许复写模板方法。

  • Spring AOP 举例实现

    • 模板类 - org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
    • 模板方法 - getAdvicesAndAdvisorsForBean(Class,String,TargatSource)
    • 子类实现
      • XML:org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator
      • 注解:org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator

责任链模式(Chain of Responsibility)实现

  • 基本概念

    包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将
    它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理
    对象的方法。

  • Spring AOP 举例实现

    • 接口 - org.springframework.aop.framework.AdvisorChainFactory
    • 实现 - org.springframework.aop.framework.DefaultAdvisorChainFactory

观察者模式(Observer)实现

  • 基本概念

    一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼
    叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

  • Spring AOP 举例实现

    • 观察者 - org.springframework.aop.framework.ProxyCreatorSupport
    • 被观察者 - org.springframework.aop.framework.AdvisedSupportListener
    • 通知对象 - org.springframework.aop.framework.AdvisedSupport

策略模式(Strategy)实现

  • 基本概念

    指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”
    ,但是每个交个人所得税就有不同的算税方法。

  • Spring AOP 举例实现
    • org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy
    • org.springframework.aop.config.ConfigBeanDefinitionParser#getAdviceClass

命令模式(Command)实现

  • 基本概念

    它尝试以物件来代表实际行动。命令物件可以把行动(action)及其参数封装起来,于是这些行动可以被:

    • 重复多次
    • 取消(如果该物件有实作的话)
    • 取消后又再重做
  • Spring AOP 举例实现

    • org.aopalliance.intercept.MethodInvocation
    • org.aspectj.lang.ProceedingJoinPoint

状态模式(State)实现

  • 基本概念

    允许对象在内部状态发生变化时更改其行为。 这种模式接近于有限状态机的概念。 状态模式可以解释为
    策略模式,它能够通过调用模式接口中定义的方法来切换策略。

  • Spring AOP 举例实现

    • 状态对象 - org.springframework.aop.framework.ProxyConfig
    • 影响对象 - org.springframework.aop.framework.AopProxy
    • org.springframework.aop.framework.JdkDynamicAopProxy
    • org.springframework.aop.framework.CglibAopProxy

Spring AOP 在 Spring Framework 内部应用

Spring AOP 在 Spring 事件(Events)

  • 核心 API - org.springframework.context.event.EventPublicationInterceptor

  • 特性描述

    当 Spring AOP 代理 Bean 中的 JoinPoint 方法执行后,Spring ApplicationContext 将发布一个自定义事件(ApplicationEvent 子类)

  • 使用限制

    • EventPublicationInterceptor 关联的 ApplicationEvent 子类必须存在单参数的构造器
    • EventPublicationInterceptor 需要被声明为 Spring Bean

Spring AOP 在 Spring 事务(Transactions)

核心 API

  • Spring 事务 @Enable 模块驱动 - @EnableTransactionManagement
  • Spring 事务注解 - @Transactional
  • Spring 事务事件监听器 - @TransactionalEventListener
  • Spring 事务定义 - TransactionDefinition
  • Spring 事务状态 - TransactionStatus
  • Spring 平台事务管理器 - PlatformTransactionManager
  • Spring 事务代理配置 - ProxyTransactionManagementConfiguration
  • Spring 事务 PointcutAdvisor 实现 - BeanFactoryTransactionAttributeSourceAdvisor
  • Spring 事务 MethodInterceptor 实现 - TransactionInterceptor
  • Spring 事务属性源 - TransactionAttributeSource

理解 TransactionDefinition(Spring 事务定义)

核心方法

  • getIsolationLevel() :获取隔离级别,默认值 ISOLATION_DEFAULT 常量,参考 org.springframework.transaction.annotation.Isolation
  • getPropagationBehavior() :获取事务传播,默认值:PROPAGATION_REQUIRED 常量,参考 org.springframework.transaction.annotation.Propagation
  • getTimeout() :获取事务执行超时时间,默认值:TIMEOUT_DEFAULT 常量
  • isReadOnly() :是否为只读事务,默认值:false

理解 TransactionStatus(Spring 事务状态)

核心方法

  • isNewTransaction() :当前事务执行是否在新的事务
  • setRollbackOnly() :将当前事务设置为只读
  • isRollbackOnly() :当前事务是否为只读
  • isCompleted() :当前事务是否完成

理解 PlatformTransactionManager(平台事务管理器)

核心方法

  • getTransaction(TransactionDefinition) :获取事务状态
  • commit(TransactionStatus) :提交事务
  • rollback(TransactionStatus) :回滚事务

理解 Spring 事务传播(Transaction Propagation)

官方文档

Spring AOP 在 Spring 缓存(Caching)

核心 API

  • Spring 缓存 @Enable 模块驱动 - @EnableCaching
  • 缓存操作注解 - @Caching@Cachable@CachePut@CacheEvict
  • 缓存配置注解 - @CacheConfig
  • 缓存注解操作数据源 - AnnotationCacheOperationSource
  • Spring 缓存注解解析器 - SpringCacheAnnotationParser
  • Spring 缓存管理器 - CacheManager
  • Spring 缓存接口 - Cache
  • Spring 缓存代理配置 - ProxyCachingConfiguration
  • Spring 缓存 PointcutAdvisor 实现 - BeanFactoryCacheOperationSourceAdvisor
  • Spring 缓存 MethodInterceptor 实现 - CacheInterceptor

Spring AOP 在 Spring 本地调度(Scheduling)

核心 API

  • Spring 异步 @Enable 模块驱动 - @EnableAsync
  • Spring 异步注解 - @Async
  • Spring 异步配置器 - AsyncConfigurer
  • Spring 异步代理配置 - ProxyAsyncConfiguration
  • Spring 异步 PointcutAdvisor 实现 - AsyncAnnotationAdvisor
  • Spring 异步 MethodInterceptor 实现 - AnnotationAsyncExecutionInterceptor

参考资料

原文地址:https://www.cnblogs.com/huangwenjie/p/15357825.html