跳转至

AOP 频繁使用的性能影响与优化

一、AOP 的性能开销

1. 代理创建

  • JDK 动态代理:运行时生成类。
  • CGLIB:生成子类。
  • 启动时创建,一次性开销。

2. 方法调用

每次调用被切面拦截的方法: - 反射调用(JDK)。 - FastClass(CGLIB)。 - 比直接调用慢几微秒。

3. 切面逻辑

日志、事务、权限,本身有 IO 开销。

二、影响大吗

  • 业务方法本身耗时毫秒级,AOP 开销微秒级,可忽略。
  • 热点方法、高频调用(每秒上万次),累积起来有影响。

三、优化

1. 精确切点

不要切所有方法:

// 不好
@Pointcut("execution(* com.example.service.*.*(..))")

// 好
@Pointcut("@annotation(com.example.Loggable)")

2. 减少切面数

多个切面合并,避免层层代理。

3. 异步日志

日志切面里异步写,不阻塞业务。

4. 关键路径不用 AOP

性能敏感的方法直接写代码。

5. CGLIB 比 JDK 快

CGLIB 用 FastClass,比 JDK 反射快。

四、监控

用 Arthas 看方法耗时,确认 AOP 是不是瓶颈。

结论

AOP 性能开销小,不要为了"可能慢"而不用。真慢了用 Arthas 定位再优化。