Skip to content

Spring AOP 相关术语都有哪些? ​

  • 标签:后端、Spring

🏛 业务架构师 ​

Spring AOP 的核心术语我按"一次横切需求的定义要素"来讲,比逐个背诵更好记:

  • Joinpoint(连接点):程序中可以被增强的点,Spring 里就是方法执行;
  • Pointcut(切点):用表达式(AspectJ 语法,如 @annotation(...) 或 execution 表达式)筛选出的 Joinpoint 子集——"哪些业务方法需要增强";
  • Advice(通知):增强逻辑本身及织入时机——前置、后置、环绕、返回后、异常后;
  • Aspect(切面):Pointcut + Advice 的组合,即一个完整横切模块;
  • Target(目标对象):被代理的业务 Bean;
  • Weaving(织入):把切面应用到目标的过程,Spring 是运行时代理织入;
  • Proxy(代理):织入产物,容器里实际注入的对象。

业务架构视角,我强调这些术语对应的是"横切需求的规格化表达":把"所有资金操作要记审计日志"翻译成"一个切面:Pointcut 锁定 @Audit 注解的方法,环绕通知里记录入参出参和耗时"——需求、实现、评审用的是同一套词汇,沟通成本极低。

实践建议:优先用自定义注解做切点(@annotation(...)),而不是 execution 包路径表达式。注解是业务语义的显式标记,重构挪包不会静默失效,评审时"这个方法被增强了"一眼可见——把隐式魔法降到最低,是团队协作的善意。

🏗 系统架构师 ​

六个核心术语,用「一次方法拦截」串起来:

  • JoinPoint(连接点):程序执行中可织入的点,Spring 里就是方法执行;
  • Pointcut(切点):用表达式筛选出真正关心的连接点(execution 表达式、@annotation);
  • Advice(通知):切点处执行的逻辑,Before/After/Around/AfterReturning/AfterThrowing;
  • Aspect(切面):切点加通知的组合模块;
  • Target(目标对象):被代理的 Bean;
  • Weaving(织入):把切面套到目标上的过程——Spring 是运行时代理织入,AspectJ 支持编译期与加载期。

我强调的理解方式:JoinPoint 是「所有候选」,Pointcut 是「过滤条件」,Advice 是「要做的事」。做平台切面设计时,Pointcut 的精确性直接决定生产风险——切宽了会拦截框架内部调用引发性能问题,切窄了漏埋点。术语背后的语义边界比术语本身重要。

💻 全栈开发专家 ​

拿一段真实切面代码对照讲:

java
@Aspect                               // 切面:切点+通知的组合类
@Component
public class ApiAuditAspect {
    @Pointcut("execution(* com.xxx.api.*.*(..))")   // 切点:在哪里拦
    public void apiPointcut() {}

    @Before("apiPointcut()")           // 通知:拦下后干什么
    public void before(JoinPoint jp) { }
}
  • JoinPoint 连接点:程序执行中可插入的点,Spring 里等于方法执行
  • Pointcut 切点:连接点的筛选条件(execution/@annotation 表达式)
  • Advice 通知:横切逻辑,Before/After/Around/AfterReturning/AfterThrowing 五种
  • Aspect 切面:切点 + 通知的载体
  • Target 目标对象:被代理的原始 Bean
  • Weaving 织入:把切面套到目标上的过程,Spring 是运行期动态代理织入
  • Proxy 代理:织入产物,容器里实际注入的就是它
  • Introduction 引入:给类动态加接口实现(@DeclareParents),用得少但常被追问

记法:切面是"预案",切点回答 Where,通知回答 What & When。排障时 JoinPoint#getTarget()(原始对象)与 getThis()(代理对象)的对比也常用来确认代理链是否生效。