Spring AOP 高频面试题(真实面试版)_第1页
Spring AOP 高频面试题(真实面试版)_第2页
Spring AOP 高频面试题(真实面试版)_第3页
Spring AOP 高频面试题(真实面试版)_第4页
Spring AOP 高频面试题(真实面试版)_第5页
全文预览已结束

下载本文档

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

文档简介

SpringAOP高频面试题(真实面试版)一、基础认知类(入门必问)1.什么是AOP?核心作用是什么?AOP即面向切面编程,是一种编程思想,和OOP面向对象编程互补。OOP主要针对类和对象做纵向的代码抽象,而AOP是针对方法层面的横向代码抽取。核心作用是把项目中重复的通用逻辑抽离出来,比如日志记录、事务控制、权限校验、接口限流、性能耗时统计等,不用在每个业务方法里重复编写,实现业务代码和通用功能代码的解耦,提升代码复用性和可维护性。2.AOP和OOP的区别是什么?1)OOP是纵向抽象,基于类、继承、多态,解决的是业务模块分层、代码复用的问题,核心是对象和类的设计;2)AOP是横向拦截,基于方法切面,解决的是通用横切逻辑冗余、代码侵入性强的问题,核心是无侵入增强业务方法;简单说:OOP管业务主体,AOP管通用增强,二者配合使用。3.SpringAOP的核心核心术语有哪些?分别解释?连接点(JoinPoint):程序中可以被拦截的点,Spring里特指所有的Bean中的方法,只有方法能作为连接点;切入点(PointCut):对连接点进行筛选的规则,不是所有方法都需要拦截,通过表达式匹配需要增强的目标方法;切面(Aspect):封装横切逻辑的类,就是我们自己写的加了@Aspect注解的类,里面包含通知和切入点规则;通知(Advice):切面中具体执行的增强逻辑,分为前置、后置、返回、异常、环绕五种;目标对象(Target):被AOP拦截增强的原始业务对象;代理对象(Proxy):Spring基于目标对象生成的代理对象,最终执行的是代理对象的方法,实现方法增强。4.SpringAOP支持哪些通知类型?执行顺序是怎样的?一共五种常用通知:1)@Before前置通知:目标方法执行之前执行;2)@After后置通知:目标方法执行完毕后执行(无论正常结束还是异常结束都会执行);3)@AfterReturning返回通知:目标方法正常执行、有返回值后执行,异常不执行;4)@AfterThrowing异常通知:目标方法抛出异常时执行;5)@Around环绕通知:包裹目标方法,可手动控制方法执行时机,功能最强。正常执行顺序:环绕前置→前置通知→目标方法执行→环绕后置→后置通知→返回通知异常执行顺序:环绕前置→前置通知→目标方法报错→后置通知→异常通知二、原理核心类(面试重点)1.SpringAOP的底层实现原理是什么?核心是动态代理机制,Spring在程序运行时,针对目标Bean动态生成代理对象,通过代理对象拦截目标方法,在方法执行前后植入切面逻辑,全程无代码侵入。SpringAOP属于运行时增强,区别于AspectJ的编译时增强,不需要修改字节码文件,完全基于容器动态实现。2.JDK动态代理和CGLIB代理的区别?Spring如何选择?JDK动态代理:基于接口实现,只能代理实现了接口的类,依赖Java原生API,执行效率高,无额外依赖;CGLIB代理:基于子类继承实现,通过继承目标类生成子类代理对象,可以代理无接口的普通类,底层操作字节码。Spring选择规则:1)Spring5.2之前:默认优先使用JDK代理(有接口),无接口则用CGLIB;2)Spring5.2及之后:默认全部使用CGLIB代理,无论是否有接口;3)可通过配置手动指定强制使用JDK代理。3.SpringAOP和原生AspectJ的区别?1)实现方式不同:SpringAOP是运行时动态代理,AspectJ是编译时字节码增强;2)功能范围不同:SpringAOP只支持方法级别的拦截,AspectJ可以拦截构造方法、字段、静态方法等,功能更全面;3)使用复杂度不同:SpringAOP整合在Spring容器中,注解式开发,简单易用;AspectJ需要单独插件,配置复杂;4)性能不同:AspectJ编译时增强,运行效率更高;SpringAOP运行时代理,略有性能损耗,但日常业务完全够用。三、实战使用与细节问题1.常用的切入点表达式有哪些?execution表达式怎么写?常用切入点:execution(最常用)、within、annotation、this、target等。execution表达式格式:execution(返回值包名.类名.方法名(参数))通配符说明:*:匹配任意返回值、任意类、任意方法、单个任意参数;..:匹配任意多层包、任意多个参数;示例:拦截所有service层所有方法:execution(*com.xxx.service.*.*(..))2.AOP能不能拦截private、static、final方法?为什么?都不能拦截,核心原因是SpringAOP基于动态代理实现:1)private方法:子类无法继承、代理对象无法访问,不能拦截;2)static方法:属于类而非对象,代理是对象级别的,无法拦截;3)final方法:无法被重写,CGLIB子类无法覆盖该方法,无法拦截;如果需要拦截以上方法,只能使用原生AspectJ。3.同一个目标方法多个切面时,执行顺序如何控制?可以通过@Order注解或者实现Ordered接口控制优先级。规则:Order数值越小,优先级越高。高优先级切面:前置通知先执行,后置/返回/异常通知后执行;低优先级切面:前置通知后执行,后置/返回/异常通知先执行。4.环绕通知和其他通知的区别?为什么开发中优先用环绕通知?1)环绕通知可以手动控制目标方法是否执行、修改入参、修改返回值、捕获异常,权限最大;2)普通通知只能在固定时机执行逻辑,无法干预目标方法的执行流程;开发中日志、事务、权限、耗时统计等场景,需要统一处理异常、修改返回结果,环绕通知可以一次性实现所有需求,代码更简洁。四、高频坑点与面试难点1.为什么AOP会出现内部调用失效的问题?这是开发中最常见的坑。当一个类中A方法调用本类的B方法时,B方法的切面逻辑不会生效。原因:AOP的增强基于代理对象,内部调用是原始对象this调用,不是代理对象调用,不会经过切面拦截。解决方案:1)将被调用方法抽离到新类;2)通过AopContext获取当前代理对象调用方法。2.SpringAOP的事务失效场景,和AOP相关的有哪些?1)事务方法被本类内部调用,AOP拦截失效,事务不生效;2)事务方法为private、static、final类型,无法被代理,事务失效;3)切面异常捕获后未抛出,Spring无法检测到异常,不会回滚事务。3.AOP拦截方法时,如何获取方法参数、方法名、注解信息?通过JoinPoint连接点对象获取:1)joinPoint.getSignature()获取方法签名、方法名;2)joinPoint.getArgs()获取方法入参;3)通过方法反射获取自定义注解,实现注解式切面拦截。4.AOP会不会影响项目性能?几乎不会有明显影响。SpringAOP仅在容器初始化时创建一次代理对象,方法执行时只是多了一层拦截判断,开销极小。日常业务接口、数据库交互的耗时远大于AOP的执行耗时,正常项目中完全可以忽略。五、实战场景面试题1.说一个你项目中使用AOP的实战场景?参考回答(真实项目通用):我在项目中主要用AOP做了三个通用功能:第一,统一日志记录,通过环绕通知拦截所有接口方法,记录请求参数、响应结果、接口耗时、异常信息,不用每个接口手动打日志;第二,接口权限校验,自定义权限注解,通过AOP拦截带注解的方法,校验当前登录用户权限,无权限直接拦截返回;第三,统一

温馨提示

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

评论

0/150

提交评论