Skip to content

定义新的通知类型 (Defining New Advice Types)

Spring AOP 被设计为具有高度可扩展性。虽然目前内部主要使用拦截(interception)实现策略,但除了环绕拦截通知(around advice)、前置通知(before advice)、异常通知(throws advice)和后置返回通知(after returning advice)之外,支持任意通知类型在技术上也是可行的。

org.springframework.aop.framework.adapter 包是一个 SPI(Service Provider Interface)包,它允许在不更改核心框架的情况下添加对新的自定义通知类型的支持。自定义 Advice 类型唯一的约束是它必须实现 org.aopalliance.aop.Advice 标记接口。

有关更多信息,请参阅 org.springframework.aop.framework.adapter 的 Javadoc。


补充教学

1. 为什么需要“扩展”通知类型?

虽然 Spring 提供的五种标准通知(Before, After, AfterReturning, AfterThrowing, Around)已经覆盖了 99% 的业务场景,但在某些极端的框架底层开发中,你可能需要定义一套全新的拦截语义。

例如,你可能想定义一种“元数据驱动通知”,它不是基于方法执行,而是基于某种特定的上下文转换。通过自定义通知类型,你可以让 Spring AOP 的执行链识别并处理这些特殊的逻辑。

2. 核心 SPI:AdvisorAdapter

要让 Spring 识别你的新通知类型,关键在于实现 AdvisorAdapter 接口。这个接口的作用是将你自定义的 Advice “适配”成 AOP 联盟标准的 MethodInterceptor

适配器接口定义:

java
public interface AdvisorAdapter {
    // 检查此适配器是否支持该通知类型
    boolean supportsAdvice(Advice advice);
    
    // 获取一个拦截器,将该通知织入到拦截器链中
    MethodInterceptor getInterceptor(Advisor advisor);
}

3. AOP 联盟 (AOP Alliance) 的遗产

Spring AOP 在底层广泛使用了 org.aopalliance 包下的接口。这是一个旨在标准化 Java AOP 实现的开源项目。

  • 标记接口Advice 只是一个空接口,用来作为“通知”这一概念的身份标识。
  • 通用标准:通过遵循这些接口,Spring AOP 可以与其他符合标准的 AOP 工具进行一定程度的互操作。

4. 架构设计的艺术:SPI 的力量

Spring AOP 的这种设计体现了开闭原则 (Open-Closed Principle)。它没有把支持的通知类型写死在核心逻辑里,而是通过一个注册注册表机制(DefaultAdvisorAdapterRegistry)来动态管理。

如果你真的需要添加新类型:

  1. 实现你的 Advice 接口。
  2. 实现对应的 AdvisorAdapter
  3. 将适配器注册到 GlobalAdvisorAdapterRegistry

虽然对于普通业务开发者来说,由于原生通知已经足够强大且易用(尤其是结合 AspectJ 表达式后),这种扩展几乎用不到,但理解它能帮你建立起“框架即插件平台”的宏观视角。

Based on Spring Framework.