Spring AOP实现原理分析

2025年Java面试宝典:
点击获取(提取码:9b3g)
为什么面试官总爱问Spring AOP?
在Java开发岗位的面试中,Spring AOP的实现原理几乎是必考题。面试官想通过这个问题考察候选人是否真正理解框架底层逻辑,而不是停留在“会使用注解”的表面层次。比如他们会问:“Spring AOP是如何实现方法增强的?”或者“动态代理在AOP中扮演了什么角色?”
这里要特别注意:Spring AOP和AspectJ的底层机制有本质区别。掌握核心原理,才能在面试中甩开其他竞争者。
Spring AOP的核心实现原理
Spring AOP的实现原理可以总结为两个核心点:动态代理和责任链模式。
-
动态代理的两种实现方式
- JDK动态代理:基于接口代理,通过
Proxy.newProxyInstance()生成代理对象。 - CGLIB动态代理:通过字节码增强生成目标类的子类实现代理。
面试时可能会追问:“什么时候用JDK代理?什么时候用CGLIB?”答案很简单:如果目标类实现了接口,优先用JDK;否则用CGLIB。但Spring Boot 2.x之后默认全用CGLIB,因为性能优化更成熟。
- JDK动态代理:基于接口代理,通过
-
责任链模式的应用
当一个方法被多个通知(Advice)拦截时(比如@Before、@Around),Spring会将所有通知按顺序封装成一个拦截器链(MethodInterceptor),逐个执行。这就是典型的责任链模式实现。

Spring AOP的底层执行流程
用“面试口述”的方式回答,可以分三步:
- 解析切面配置:Spring启动时扫描所有@Aspect注解的类,解析@Pointcut、@Around等注解,生成Advisor对象。
- 创建代理对象:根据目标对象类型(是否实现接口)选择JDK或CGLIB生成代理类。
- 执行拦截逻辑:调用代理对象的方法时,触发拦截器链,按顺序执行前置通知、目标方法、后置通知等。
这里有个高频考点:@Around和@Before/@After的执行顺序。记住@Around是最外层的“包装”,内部再执行其他通知。
实际开发中的避坑指南
虽然Spring AOP用起来方便,但隐藏着几个大坑:
- 同类内方法调用失效:如果类A的方法a()直接调用自己的方法b(),b()上的AOP注解不会生效。这是因为代理对象只能拦截外部调用。
- final类和方法的限制:CGLIB无法代理final修饰的类或方法,会导致AOP失效。
- 性能损耗:动态代理会带来一定的性能开销,在高并发场景需要谨慎评估。
面试加分技巧
想要在回答时脱颖而出,可以补充两点:
- Spring AOP和AspectJ的对比:AspectJ是编译时/类加载时织入,功能更强大但侵入性高;Spring AOP是运行时织入,轻量但功能受限。
- 实际优化案例:比如用@Around统计方法耗时,但要注意异常处理和资源释放。

如果大家在准备面试时需要Java面试宝典或者想购买面试鸭会员,可以通过面试鸭返利网找我,最高可返利25元!本文提到的技术原理和避坑经验都整理在网盘资料中,建议下载后结合代码实践加深理解。
(完)


