1. Spring AOP 核心机制解析
在Spring框架中,AOP(面向切面编程)是一个非常重要的概念。要真正理解AOP,我们需要从最基础的问题开始:当你从Spring容器中获取一个Bean时,你拿到的到底是什么?
1.1 Bean的生命周期与AOP介入时机
Spring容器管理Bean的完整生命周期包括多个阶段:
- BeanDefinition创建:解析配置或注解,生成Bean的定义信息
- 实例化:通过反射调用构造方法创建对象实例
- 属性填充:完成依赖注入
- 初始化:执行@PostConstruct方法和InitializingBean接口的afterPropertiesSet()
- AOP代理创建:判断是否需要创建代理对象
- 使用阶段:应用程序通过容器获取并使用Bean
关键点在于:AOP的介入发生在Bean初始化完成之后。这意味着:
- 构造方法已经执行完毕
- 所有依赖注入已经完成
- @PostConstruct方法已经调用
- Bean已经是一个"完整可用"的状态
重要提示:AOP不会修改原始Bean本身,而是创建一个代理对象包裹原始Bean。这就是为什么你从容器中获取的Bean可能不是原始对象。
1.2 代理对象的本质
Spring AOP主要通过两种方式创建代理:
- JDK动态代理:基于接口实现,要求目标类必须实现至少一个接口
- CGLIB代理:通过继承方式实现,可以代理没有接口的类
代理对象的核心职责是拦截方法调用,在方法执行前后插入增强逻辑。这种设计带来了几个重要特性:
- 原始Bean不会被修改
- 业务代码保持纯净
- 横切关注点(如日志、事务)可以集中处理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AOP的核心概念深度解析
2.1 切点(Pointcut)详解
切点定义了哪些方法需要被拦截。Spring提供了多种表达式方式来定义切点:
2.1.1 execution表达式
这是最常用的切点表达式,语法为:
java复制execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
实际应用示例:
java复制// 匹配com.example.service包下所有类的public方法
execution(public * com.example.service.*.*(..))
// 匹配所有Service结尾的类的方法
execution(* *..*Service.*(..))
2.1.2 @annotation表达式
通过注解精确匹配方法:
java复制// 匹配带有@Transactional注解的方法
@annotation(org.springframework.transaction.annotation.Transactio
