Spring AOP实现原理与拦截器是Java开发中的核心技术,通过动态代理(JDK/CGLIB)实现方法拦截,适用于日志、事务、权限等场景。JDK动态代理基于接口,CGLIB通过继承增强,Spring默认优先使用JDK代理。拦截器分为前置、后置和环绕增强,可控制方法执行流程。实际应用中,拦截器链按顺序执行,如鉴权→限流→日志。高频面试题包括Spring AOP与AspectJ区别、参数修改及循环依赖解决方案。掌握这些知识能提升系统设计能力,适合Java开发者深入学习。
📚2025年Java面试宝典:点击下载
(提取码:9b3g)
Spring AOP的实现核心是动态代理,它通过两种方式实现:JDK动态代理和CGLIB字节码增强。
InvocationHandler
拦截逻辑。面试中常被问到两者的区别,可以这样回答:
"JDK动态代理基于接口,运行时生成代理类;CGLIB通过继承方式增强,性能略低但适用性更广。Spring默认优先使用JDK代理,当无接口时自动切换CGLIB。"
拦截器(Interceptor)是AOP中的核心组件,其工作流程分为三个阶段:
实际开发中,拦截器链(Interceptor Chain)会按顺序执行。例如,一个接口限流场景可能包含:
鉴权拦截器 → 限流拦截器 → 日志拦截器 → 目标方法
| 对比项 | JDK动态代理 | CGLIB | |------------------|--------------------------|--------------------------| | 实现方式 | 接口代理 | 子类继承 | | 性能 | 调用速度快 | 生成代理类耗时 | | 依赖 | 需目标类实现接口 | 无限制 | | 方法拦截 | 仅拦截接口方法 | 可拦截所有非final方法 |
面试中如果被问_“为什么有的场景必须用CGLIB?”_,可以结合案例:
"例如目标类没有实现接口,或者需要拦截非public方法时,CGLIB是唯一选择。"
例如,在电商系统中,下单接口可能需要以下拦截器:
风控拦截器 → 库存校验 → 优惠券核销 → 生成订单
Spring通过ProxyFactory
类将拦截器织入目标对象。核心步骤如下:
MethodInterceptor
接口编写业务逻辑。一个典型的环绕增强代码逻辑:
public Object invoke(MethodInvocation invocation) throws Throwable {
// 前置逻辑
System.out.println("Before method: " + invocation.getMethod().getName());
// 执行目标方法
Object result = invocation.proceed();
// 后置逻辑
System.out.println("After method: " + invocation.getMethod().getName());
return result;
}
"Spring AOP是运行时增强,基于代理;AspectJ是编译时/类加载时增强,功能更强大但需要额外插件。"
"可以,在环绕增强中通过
MethodInvocation
获取参数数组并修改。"
"避免在拦截器中直接调用被代理的方法,改用BeanFactory获取代理对象。"
💡小贴士:如果需要购买面试鸭会员,可以通过面试鸭返利网联系我,返利25元!
(官网地址:mianshiyafanli.com)
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包