Spring AOP API (Spring AOP APIs)
前一章描述了 Spring 对使用 @AspectJ 和基于 XML Schema 的切面定义的 AOP 支持。在本章中,我们将讨论底层的 Spring AOP API。对于大多数通用的应用程序,我们推荐按照前一章所述,使用带有 AspectJ 切入点表达式的 Spring AOP。
章节摘要
- Spring 中的切入点 (Pointcut) API
- Spring 中的通知 (Advice) API
- Spring 中的 Advisor API
- 使用 ProxyFactoryBean 创建 AOP 代理
- 精简的代理定义
- 使用 ProxyFactory 以编程方式创建 AOP 代理
- 操作被通知的对象
- 使用“自动代理 (Auto-proxy)”功能
- 使用 TargetSource 实现
- 定义新的通知类型
补充教学
1. 为什么还要学习底层 API?
在现代 Spring 开发中,我们绝大多数时间都在写 @Aspect 和 @Around。既然官方推荐使用声明式 AOP,那学习这些底层接口还有意义吗?
- 理解底层原理:无论你用的是注解还是 XML,Spring 最终都会将它们解析为底层的
Pointcut、Advice和Advisor。掌握这些 API 是从“面试八股文”进阶到“底层架构师”的必经之路。 - 框架开发与中间件:如果你正在编写一个 Spring Boot Starter,或者需要动态地根据配置为某些类添加日志、安全检查,编程式的
ProxyFactory比注解更灵活。 - 解决复杂场景:有些极致的动态需求(如根据运行时权限动态改变拦截逻辑)通过静态注解很难表达,此时底层 API 就是你的瑞士军刀。
2. 核心概念地图
为了防止在后续细节中迷失,请记住这三个核心角色的关系:
- Advice (通知):做什么。包含具体的拦截逻辑(如日志打印、事务开启)。
- Pointcut (切入点):在哪里做。定义了哪些类、哪些方法应该被拦截。
- Advisor (切面/向导):组合者。它将一个
Advice和一个Pointcut绑定在一起。在 Spring 中,一个 Advisor 就是一个最简单的“切面”。
3. 如何阅读本章
- 如果你是应用开发者:重点关注 ProxyFactory 和 自动代理,这些在编写测试或动态工具类时最常用。
- 如果你是中间件/框架开发者:你需要精通 Pointcut API 和 TargetSource,后者允许你实现极其强大的功能,如池化对象代理、热插拔代理目标等。