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()(代理对象)的对比也常用来确认代理链是否生效。