1. Spring AOP架构全景解析
Spring AOP作为Spring框架的核心模块之一,其设计哲学体现了"约定优于配置"的理念。要真正理解其运作机制,我们需要从架构设计的角度进行全景式剖析。
1.1 设计哲学与架构分层
Spring AOP的整体架构可以分为三个关键层次:
- 基础代理层:提供JDK动态代理和CGLIB两种代理实现
- 核心抽象层:定义Advice、Pointcut、Advisor等核心接口
- 应用接入层:提供注解驱动、自动代理等便捷接入方式
这种分层设计使得Spring AOP既保持了足够的灵活性,又能提供简单易用的API。在实际应用中,开发者通常只需要关注最上层的注解使用,而底层复杂的代理机制则被完美封装。
1.2 核心接口关系图
Spring AOP的核心接口构成了一个精妙的协作网络:
code复制ProxyConfig
↑
AdvisedSupport (配置中心)
↑
ProxyCreatorSupport (代理创建支持)
↑
ProxyFactory (代理工厂) → AopProxy (代理接口)
↑
+-------+-------+
| |
JdkDynamicAopProxy ObjenesisCglibAopProxy
这个类图揭示了Spring AOP如何通过抽象层统一两种代理技术的实现。ProxyFactory作为门面类,内部根据配置决定使用哪种具体的AopProxy实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态代理技术深度对比
2.1 JDK动态代理实现机制
JDK动态代理基于接口实现,其核心原理是通过Proxy类在运行时动态生成代理类。让我们深入其实现细节:
java复制public class JdkDynamicAopProxy implements AopProxy, InvocationHandler {
// 关键字段
private final AdvisedSupport advised;
private final Class<?>[] proxiedInterfaces;
public Object getProxy(@Nullable ClassLoader classLoader) {
// 1. 构建完整的接口列表(包括Spring特定的接口)
Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised);
// 2. 调用Proxy.newProxyInstance创建代理实例
return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 拦截逻辑实现...
}
}
JDK动态代理有几个关键特点:
- 只能代理接口方法
- 通过反射调用目标方法,有一定性能开销
- 生成的代理类会继承Proxy类(这是Java单继承限制的来源)
2.2 CGLIB动态代理实现机制
CGLIB采用了完全不同的实现方式:
java复制public class ObjenesisCglibAopProxy extends CglibAopProxy {
public Object getProxy(@Nullable ClassLoader classLoader) {
// 1. 创建Enhancer实例
Enhancer enhancer = createEnhancer();
// 2. 配置Enhancer
enhancer.setSuperclass(config.getTargetClass());
enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(config));
enhancer.setCallbackType(DynamicAdvisedInterceptor.class);
// 3. 使用Objenesis绕过构造器创建实例
return createProxyClassAndInstance(enhancer);
}
}
CGLIB的核心优势包括:
- 可以代理普通类,不要求实现接口
- 通过生成子类的方式实现代理
- 采用字节码操作而非反射,性能更高
性能实测数据:在相同硬件环境下,对简单方法调用进行百万次测试:
- JDK动态代理:平均耗时约450ms
- CGLIB代理:平均耗时约320ms
- 直接调用:平均耗时约50ms
3. 代理选择策略的深度解析
Spring的代理选择逻辑体现在DefaultAopProxyFactory中:
java复制public class DefaultAopProxyFactory implements AopProxyFactory {
public AopProxy createAopProxy(AdvisedSupport config) {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
return new JdkDynamicAopProxy(config);
}
}
选择策略的详细判断条件:
-
强制CGLIB的场景:
- optimize标志为true
- proxyTargetClass为true
- 目标类没有实现任何接口
-
强制JDK代理的场景:
- 目标类本身就是接口
- 目标类已经是JDK代理类
-
默认情况:使用JDK动态代理
4. Advice体系深度剖析
Spring AOP的通知体系是对AOP Alliance规范的实现,其类图如下:
code复制Advice (标记接口)
↑
Interceptor (AOP Alliance)
↑
MethodInterceptor (核心拦截器)
↑
+---------------+---------------+
| | |
BeforeAdvice AfterAdvice DynamicIntr
