跳到正文
Elaine Blog
返回

AOP 代理创建与调用链

Spring 生态与源码

Spring AOP 在 Bean 外包一层代理。外部调用先经过匹配的拦截器链,再执行目标方法;只有经过代理的调用才能获得日志、事务、缓存等横切能力。

Table of contents

Open Table of contents

运行注解切点实验

TracingAspect下载拦截带 @Measured 的方法:

mvn -Dtest=SpringSourceLabTest#aspectWrapsCallsThroughTheProxy test

测试先用 AopUtils.isAopProxy 确认容器返回代理,再断言调用计数。只断言业务结果无法证明切面真的执行。

从切点到拦截器链

**切点(Pointcut)**判断哪些方法需要增强;**通知(Advice)**定义调用前后做什么;Advisor把两者组合。自动代理创建器作为 BeanPostProcessor, 在初始化后为匹配 Bean 创建代理。

调用代理方法时,框架计算匹配拦截器,按顺序执行。proceed() 把控制权交给下一环;环绕通知漏调 proceed() 会吞掉目标方法,多调则会重复执行业务。

JDK 代理与类代理

JDK 动态代理实现目标接口,调用方应依赖接口。类代理生成目标类子类,能代理无接口类,但 final 类和 final 方法不能被覆盖。两者都无法拦截对象内部的 this.method()

不要根据类名字符串判断代理。使用 AopUtils、目标类工具和实际 Advisor 列表诊断。

切面要保持轻量

日志、指标切面不能记录密码、令牌或巨大正文。计时应使用单调时钟并在 finally 上报;异常处理要保留原始 cause。切面顺序应通过测试固定,特别是事务、重试和鉴权的相对位置。

下一步

阅读声明式事务的传播、隔离与失效场景,把事务看作一条特殊的 AOP 拦截器链。


分享这篇文章:

上一篇
Spring 扩展点实战:Registrar、Factory、PostProcessor 与 Listener
下一篇
声明式事务的传播、隔离与失效场景