• 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

    参考资料

  • 相关阅读:
    关于在MyEclipse中页面中文乱码的问题
    如何用Navicat for MySQL 将mysql中的数据库导出,导入。
    淘宝链接池的配置
    c3p0配置
    人生规划
    spring问题: Unable to validate using XSD: Your JAXP provider
    List数组和Set集合
    Tomcat6内存不足问题及解决方法
    清华校长送给毕业生的五句话
    个人图文理解类的封装
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/15357825.html
Copyright © 2020-2023  润新知