Spring AOP 高频面试题及真实口语化答案_第1页
Spring AOP 高频面试题及真实口语化答案_第2页
Spring AOP 高频面试题及真实口语化答案_第3页
Spring AOP 高频面试题及真实口语化答案_第4页
Spring AOP 高频面试题及真实口语化答案_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SpringAOP高频面试题及真实口语化答案一、基础概念篇(初级必问)1、什么是AOP?核心作用是什么?AOP就是面向切面编程,是对OOP面向对象编程的补充。OOP是纵向的类和方法封装,AOP是横向的功能增强。简单说就是:在不修改原有业务代码的前提下,对方法进行统一增强。主要用来处理系统通用的非业务逻辑,比如日志记录、事务控制、权限校验、接口耗时统计、限流、缓存等,做到业务代码和通用功能解耦。2、AOP的核心术语有哪些?分别是什么意思?不用死记官方定义,面试这么说最接地气:切面(Aspect):就是我们写的AOP增强类,里面封装了所有通用增强逻辑,比如日志切面、事务切面。连接点(JoinPoint):所有可以被AOP拦截的点,Spring里特指所有的方法。切入点(Pointcut):从所有连接点中,筛选出来需要真正拦截的方法,就是我们配置的execution表达式对应的方法。通知/增强(Advice):拦截方法后,要执行的具体逻辑,比如前置通知、后置通知。目标对象(Target):被AOP代理的原始业务类对象。代理(Proxy):Spring生成的目标对象的代理对象,用来执行增强逻辑。织入(Weaving):把切面的增强逻辑,嵌入到目标方法的过程,Spring是在运行时织入的。3、AOP和OOP的区别?OOP是垂直抽象,靠封装、继承、多态实现代码复用,解决的是业务代码分层、复用的问题。AOP是横向扩展,在不改动原有代码的基础上,统一给批量方法加通用功能,解决的是通用代码冗余、侵入业务的问题。举个例子:每个接口都要打日志、算耗时,用OOP要每个方法手写,代码冗余;用AOP直接统一拦截,一行业务代码不用改。二、核心原理篇(中级高频)4、SpringAOP的实现原理是什么?核心就是动态代理。SpringAOP是基于运行时动态代理实现的,不是静态编译(和AspectJ不一样)。简单流程:项目启动后,Spring扫描切面类,根据切入点匹配规则,找到需要增强的目标类,在运行时自动生成代理对象,后续调用方法时,走代理对象的逻辑,先执行AOP增强,再执行原业务方法。5、SpringAOP有两种代理方式,区别和使用场景?SpringAOP默认自动适配两种代理,无需手动指定:JDK动态代理:只能代理实现了接口的类,基于接口生成代理对象,性能稍高,是默认优先选择。CGLIB代理:可以代理没有接口的普通类,通过继承目标类生成子类作为代理,SpringBoot2.0之后默认就是CGLIB。关键区别:JDK代理只能拦截接口方法,CGLIB可以拦截普通类所有非final方法。6、SpringAOP和原生AspectJ的区别?很多人会混淆,面试重点区分:SpringAOP:属于Spring框架自带,运行时动态代理,无需额外编译,功能轻量化,只支持方法级别的拦截,够用、简单,项目中常用。AspectJ:是独立的AOP框架,编译期织入,功能更强,支持类、字段、构造器等各种拦截,但是需要额外编译插件,项目中一般很少单独用。日常开发中我们用的@Aspect注解,本质是Spring整合了AspectJ的注解,底层还是SpringAOP的动态代理。7、AOP的五种通知类型及执行顺序?五种通知是实际开发最常用的,顺序一定要记牢:@Before前置通知:目标方法执行之前执行@Around环绕通知:包裹目标方法,可在方法前后自定义逻辑,权限最高@AfterReturning后置正常返回通知:方法正常执行完毕、无异常时执行@AfterThrowing异常通知:方法抛出异常时执行@After最终后置通知:无论方法正常结束还是抛异常,都会执行(类似finally)完整执行顺序:环绕前置>前置通知>目标方法执行>环绕后置>正常返回/异常通知>最终后置通知。三、实战应用篇(面试必考项目落地)8、你项目中AOP用过哪些场景?怎么实现的?直接说真实项目场景,不空洞:我在项目中主要用AOP做过4个功能:统一日志记录:自定义注解+AOP,拦截所有controller接口,自动记录请求参数、响应结果、请求耗时、操作人、IP,不用每个接口手动打日志。接口权限校验:自定义权限注解,AOP拦截方法,校验当前登录用户是否有对应接口权限,无权限直接拦截抛出异常。事务统一管控:简化事务操作,通过AOP对指定方法统一开启、提交、回滚事务。防重复提交:自定义注解,AOP拦截接口,基于Redis判断短时间内是否重复请求,拦截重复提交。9、AOP中execution表达式怎么写?常用规则?不用记复杂的,面试和开发常用写法:拦截指定包下所有类所有方法:execution(*com.xxx.service.*.*(..))拦截所有controller接口:execution(*com.xxx.controller.*.*(..))符号说明:第一个*代表任意返回值,第二个*代表任意类,第三个*代表任意方法,(..)代表任意参数。10、怎么获取目标方法的参数、方法名、注解信息?通过JoinPoint连接点对象获取,实战常用:joinPoint.getSignature().getName():获取方法名joinPoint.getArgs():获取方法入参通过反射获取方法上的自定义注解,实现个性化增强如果是环绕通知,用ProceedingJoinPoint,可以手动执行proceed()调用目标方法。四、坑点&进阶难点(中高级面试必问)11、AOP为什么拦截不到自己类内部的方法调用?(高频坑)这是面试超级高频的问题,核心原因:AOP是基于代理对象实现的,内部方法调用走的是原始对象,不走代理。比如:A类的a方法调用本类的b方法,b方法有AOP增强,但是不会生效。因为a方法执行时用的是this(原始对象),不是Spring的代理对象。解决方案:方式1:通过Spring上下文获取当前类的代理对象,用代理对象调用方法方式2:开启expose-proxy=true,通过AopContext获取代理对象方式3:拆分方法到不同类,避免同类内部调用12、final、static、private方法能被AOP拦截吗?都不能,原因不同:private方法:访问权限私有,代理对象无法重写,拦截不到static方法:属于类不属于对象,动态代理是基于对象代理,无法拦截final方法:无法被重写,CGLIB继承代理、JDK接口代理都无法覆盖,所以拦截失效13、多个切面的执行顺序怎么控制?用@Order(value=数字)注解控制优先级。规则:数字越小,优先级越高。执行顺序:高优先级切面先执行前置通知,后执行后置通知(先进后出)。比如:Order(1)和Order(2),前置:1>2,后置:2>1。14、AOP会导致事务失效吗?哪些场景会失效?会,Spring事务底层就是AOP,很多事务失效问题本质就是AOP失效:同类内部方法调用,导致AOP代理失效,事务不生效方法是private、static、final,无法被AOP拦截,事务失效没有被Spring管理的类,无法生成代理对象,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论