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 定位再优化。