AOP 面试题及详细答案(真实面试版)_第1页
AOP 面试题及详细答案(真实面试版)_第2页
AOP 面试题及详细答案(真实面试版)_第3页
AOP 面试题及详细答案(真实面试版)_第4页
AOP 面试题及详细答案(真实面试版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

AOP面试题及详细答案(真实面试版)一、基础概念篇(初级必问)1、什么是AOP?核心作用是什么?参考答案:AOP全称面向切面编程,是一种和OOP面向对象编程互补的编程思想。OOP是纵向的,通过类和对象划分业务模块;而AOP是横向的,专门用来处理系统通用的公共逻辑,不和核心业务代码耦合。简单说:AOP就是在不修改原有业务代码的前提下,对方法进行增强。核心作用:统一处理公共重复逻辑,比如日志记录、事务控制、权限校验、接口限流、性能耗时统计、缓存控制等,实现业务代码和通用代码解耦。2、AOP和OOP的区别?为什么有了OOP还需要AOP?参考答案:OOP解决的是业务模块拆分,通过封装、继承、多态实现代码复用,但无法解决横向散落的重复代码。比如系统里所有接口都需要打日志、校验权限,这些代码散落在各个业务方法中,用OOP抽取公共方法也无法彻底解耦,调用处还是要手动调用。而AOP可以横向切入所有目标方法,自动植入公共逻辑,无需业务代码手动调用,彻底实现解耦,让核心业务只关注业务本身。3、AOP核心术语有哪些?分别解释一下?参考答案:切面(Aspect):封装公共逻辑的类,也就是我们写的AOP增强类,里面包含通知和切点定义。连接点(JoinPoint):程序中可以被AOP拦截的点,Spring里特指所有的方法。切点(Pointcut):对连接点进行筛选,只拦截符合规则的方法,是具体的拦截规则表达式。通知/增强(Advice):切面中具体执行的公共逻辑,分为前置、后置、异常、最终、环绕通知。目标对象(Target):被AOP拦截、增强的原始业务类对象。代理对象(Proxy):AOP底层生成的目标对象代理,用来替代原对象执行方法,完成增强逻辑。织入(Weaving):将切面逻辑嵌入到目标方法的过程,Spring是在运行时完成织入。4、SpringAOP支持哪些通知类型?执行顺序是什么?参考答案:SpringAOP一共5种通知:@Before前置通知:目标方法执行前执行@AfterReturning后置返回通知:目标方法正常执行完毕、无异常时执行@AfterThrowing异常通知:目标方法抛出异常时执行@After最终通知:无论方法正常结束还是抛异常,都会执行,类似finally@Around环绕通知:包裹目标方法,可在方法前后增强,还能控制方法是否执行、修改返回值正常执行无异常顺序:环绕前置→前置通知→目标方法执行→环绕后置→后置返回→最终通知执行出现异常顺序:环绕前置→前置通知→目标方法抛异常→异常通知→最终通知(环绕后置和后置返回不执行)二、原理与底层篇(中级核心)5、SpringAOP的底层原理是什么?参考答案:SpringAOP底层核心是动态代理机制,在程序运行阶段,动态生成目标类的代理对象,通过代理对象拦截方法调用,植入切面增强逻辑,不修改原代码。Spring会根据目标类的情况,自动选择两种代理方式:如果目标类有接口:使用JDK动态代理,基于接口生成代理类如果目标类没有接口:使用CGLIB动态代理,基于子类继承的方式生成代理类6、JDK动态代理和CGLIB代理的区别?各自优缺点?参考答案:JDK动态代理依赖接口,只能对实现了接口的类生成代理基于Java原生API,无需引入额外依赖缺点:无接口的类无法使用CGLIB代理基于继承子类实现,无需接口,直接对类代理可以代理普通类、无接口类,适用范围更广缺点:无法代理被final修饰的类和方法(无法继承、重写)早期需要引入第三方依赖,Spring3.2后已内置,无需手动引入补充:SpringBoot2.0之后,默认统一使用CGLIB代理,不再优先JDK代理。7、SpringAOP和AspectJ的区别?参考答案:很多人会混淆两者,简单总结:SpringAOP是简化版、运行时AOP;AspectJ是完整版、编译期AOP。SpringAOP:属于Spring框架自带功能,运行时动态代理,仅支持方法级别的拦截,使用简单,能满足日常业务绝大多数场景,无需额外编译。AspectJ:是独立的AOP框架,功能更强,支持编译期织入、类加载织入、运行时织入,不仅能拦截方法,还能拦截构造器、字段、静态方法等,但需要额外编译插件,配置更复杂。日常开发场景:我们在Spring中用的@Aspect、@Pointcut等注解,是Spring整合了AspectJ的注解,底层实现依然是Spring自己的动态代理,不是原生AspectJ。8、AOP为什么只能拦截方法?不能拦截字段、构造器?参考答案:因为SpringAOP底层基于动态代理实现,而动态代理的本质是对目标对象的方法调用进行拦截。字段赋值、构造器创建对象的过程,不属于方法调用,代理对象无法感知,所以无法拦截。如果需要拦截字段、构造器,必须使用原生AspectJ编译期织入,这也是SpringAOP的功能局限。三、实战开发篇(面试高频)9、常用的切点表达式有哪些?execution表达式怎么写?参考答案:常用切点表达式:execution:最常用,根据方法权限、返回值、包名、类名、方法名精准拦截annotation:拦截带有指定自定义注解的方法,实战最常用、最精准within:拦截指定包、指定类下的所有方法execution语法示例:execution(*com.xxx.service.*.*(..))拆解:第一个*:任意返回值com.xxx.service.*:service包下所有类第二个*:类中所有方法(..):任意参数列表实战推荐:优先用自定义注解+annotation切点,粒度更细,不会拦截无关方法,兼容性更好。10、环绕通知和其他通知的区别?实际开发中什么时候用环绕?参考答案:普通前置、后置通知只能被动在固定时机执行逻辑,无法控制目标方法的执行。环绕通知是功能最强的通知,有以下独有特性:可以手动控制是否执行目标方法(proceed()方法决定是否放行)可以在方法前后自由编写逻辑,整合所有通知的功能可以修改目标方法的入参、返回值,甚至捕获异常自行处理适用场景:接口耗时统计、权限拦截(不通过直接拦截不放行)、参数预处理、返回值统一封装、全局异常兜底。11、AOP如何获取目标方法的参数、方法名、注解信息?参考答案:通过JoinPoint连接点对象获取,环绕通知用ProceedingJoinPoint(JoinPoint的子类)。常用API:joinPoint.getSignature().getName():获取方法名joinPoint.getArgs():获取方法入参joinPoint.getTarget():获取目标对象通过反射getAnnotation():获取方法上的自定义注解属性四、坑点与疑难问题篇(进阶加分)12、AOP失效的场景有哪些?(超级高频)参考答案:实际开发中AOP失效90%都是以下5种情况,面试必答:内部调用失效:同一个类中,A方法直接调用本类的B方法,B方法的AOP失效。原因是this调用的是原对象,不是Spring代理对象,没有经过AOP拦截。方法被final/static/private修饰:CGLIB基于重写方法实现增强,final、static、private方法无法重写,无法被拦截。切面类没有交给Spring管理:切面类没有加@Aspect+@Component,容器无法识别切面,不会织入逻辑。切点表达式书写错误:包名、类名匹配错误,导致没有拦截到目标方法。多切面顺序冲突、事务嵌套导致失效:切面优先级过低,被其他切面覆盖拦截。内部调用解决方案:通过Spring上下文获取当前类的代理对象,用代理对象调用方法。13、多个切面同时拦截一个方法,执行顺序怎么控制?参考答案:通过@Order注解控制优先级,数值越小优先级越高。执行规则:前置通知:优先级高的先执行后置通知:优先级高的后执行(先进后出)比如:@Order(1)的切面会比@Order(10)的切面优先执行前置逻辑,后置逻辑则相反。14、AOP和Spring事务的关系?事务失效和AOP有关吗?参考答案:Spring事务的底层就是基于AOP实现的。@Transactional注解本质就是一个AOP切面,在方法开启前开启事务,方法正常结束提交事务,抛异常回滚事务。常见事务失效和AOP相关的原因:同类内部方法调用,事务方法被普通方法调用,AOP无法拦截,事务失效方法是非public修饰,Spring事务切面不拦截非公开方法15、AOP会不会影响接口性能?参考答案:几乎不会影响业务性能,可以忽略不计。AOP的代理创建只在容器启动初始化时执行一次,方法运行时只是简单的拦截、反射调用,开销极小。日常接口QPS上万的场景下,也不会产生性能瓶颈。只有在大量极端反射、重复解析注解的场景下,才会有微小损耗,正常开发无需优化。五、手写实战问答(拔高题)16、你项目中用AOP做过什么功能?参考答案(项目真实话术,可直接背诵):我在项目中主要用AOP统一处理各类公共通用逻辑,规避代码重复,提升开发效率:第一,统一日志记录,通过自定义注解+AOP环绕通知,自动记录接口入参、出参、请求耗时、异常信息,不用每个接口手动打日志,方便线上问题排查。第二,接口权限校验,拦截所有接口请求,获取当前登录用户权限,校验是否拥有接口访问权限,统一拦截无权限请求。第三,统一接口限流,基于注解实现接口维度的限流,通过AOP拦截请求,统计单位时间请求次数,超出阈值直接拦截返回提示。第四,数据脱敏、返回值统一封装,通过AOP对接口返回的手机号、身份证号自动脱敏,统一封装接口返回格式

温馨提示

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

最新文档

评论

0/150

提交评论