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>
思维导图
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
- 激活 AspectJ 自动代理:
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/>
- 激活 AspectJ 自动代理:
底层 API
- 实现:JDK 动态代理、CGLIB 以及 AspectJ
- API:
- 代理:
AopProxy
- 配置:
ProxyConfig
- Join Point:
Joinpoint
- Pointcut :
Pointcut
- Advice :
Advice
、BeforeAdvice
、AfterAdvice
、AfterReturningAdvice
、ThrowsAdvice
- 代理:
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
- 代理工厂 -
ProxyFactory
、ProxyFactoryBean
AopProxyFactory
配置管理器 -AdvisedSupport
- IoC 容器自动代理抽象 -
AbstractAutoProxyCreator
接入点接口 - Joinpoint
Interceptor
执行上下文 -Invocation
- 方法拦截器执行上下文 -
MethodInvocation
- 构造器拦截器执行上下文 -
ConstructorInvocation
- 方法拦截器执行上下文 -
MethodInvocation
实现- 基于反射 -
ReflectiveMethodInvocation
- 基于 CGLIB -
CglibMethodInvocation
- 基于反射 -
Joinpoint 条件接口 - Pointcut
核心组件:
- 类过滤器 -
ClassFilter
- 方法匹配器 -
MethodMatcher
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
- 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 标准实现
接口:
- 标准接口 -
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 标准实现
- 接口
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
- 接口 -
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
- 接口 -
org.springframework.aop.IntroductionAdvisor
- 元信息
org.springframework.aop.IntroductionInfo
- 通用实现
org.springframework.aop.support.DefaultIntroductionAdvisor
- AspectJ 实现
org.springframework.aop.aspectj.DeclareParentsAdvisor
- 元信息
Advisor 的 Interceptor 适配器 - AdvisorAdapter
- 接口 -
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
- 接口 -
org.springframework.aop.framework.AopProxy
- 实现
- JDK 动态代理
org.springframework.aop.framework.JdkDynamicAopProxy
- CGLIB 字节码提升
org.springframework.aop.framework.CglibAopProxy
org.springframework.aop.framework.ObjenesisCglibAopProxy
- JDK 动态代理
AopProxy 工厂接口与实现
- 接口 -
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
- 核心 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
- 核心 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
- Spring IoC 容器整合
- 特性增强
- 实现
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
- AspectJ 元数据 -
- 基类 -
AdvisedSupport 事件监听器 - AdvisedSupportListener
- 核心 API -
org.springframework.aop.framework.AdvisedSupportListener
- 事件对象 -
org.springframework.aop.framework.AdvisedSupport
- 事件来源 -
org.springframework.aop.framework.ProxyCreatorSupport
- 激活事件触发 -
ProxyCreatorSupport#createAopProxy
- 变更事件触发 - 代理接口变化时、 Advisor 变化时、配置复制
- 事件对象 -
IoC 容器自动代理抽象 - AbstractAutoProxyCreator
- API -
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
- 基类 -
org.springframework.aop.framework.ProxyProcessorSupport
- 特点
- 与 Spring Bean 生命周期整合
org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
- 与 Spring Bean 生命周期整合
- 基类 -
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 IDexpression
- (必须)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
- JDK -
- 实现 -
模板方法模式(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
- XML:
- 模板类 -
责任链模式(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