1. Spring AOP核心机制解析
Spring框架的AOP(面向切面编程)实现是其最富特色的功能模块之一。不同于传统的OOP编程范式,AOP通过动态代理技术实现了横切关注点的模块化。在Spring容器启动过程中,当检测到Bean实现了接口或标注了@Aspect注解时,会通过以下两种方式创建代理对象:
- JDK动态代理:基于接口实现,使用java.lang.reflect.Proxy创建代理实例
- CGLIB字节码增强:通过继承目标类生成子类,适用于无接口的类
关键选择:Spring优先尝试JDK动态代理,当目标类未实现接口时自动切换为CGLIB。可通过@EnableAspectJAutoProxy(proxyTargetClass=true)强制使用CGLIB
代理对象的创建时机发生在Bean初始化完成后(postProcessAfterInitialization阶段),通过AbstractAutoProxyCreator实现类完成整个代理创建流程。这里有个实际开发中的经验:如果发现AOP未生效,首先需要检查Bean是否被Spring容器管理,其次确认是否在同一个容器内调用(自调用问题)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心源码执行链路剖析
2.1 代理创建入口
在AbstractAutoProxyCreator.wrapIfNecessary方法中,主要处理逻辑如下:
java复制protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
// 1. 检查是否已处理过
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
}
// 2. 检查是否应跳过代理
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
// 3. 检查是否是基础Bean或应跳过的Bean
if (isInf
