版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AOP面试题及详细答案(实战完整版)一、基础概念类(初级必问)1、什么是AOP?核心作用是什么?参考答案:AOP全称面向切面编程,是一种和OOP面向对象编程互补的编程思想。OOP是纵向的、基于类和对象的代码复用,而AOP是横向的,用来对系统中重复的通用逻辑进行统一抽取和增强。简单说就是:在不修改原有业务代码的前提下,对方法进行功能增强。核心作用:解耦通用非业务逻辑,避免代码冗余。比如日志记录、事务控制、权限校验、性能监控、缓存处理、异常统一处理这些通用逻辑,不用在每个业务方法里重复写。2、AOP和OOP的区别?为什么有了OOP还需要AOP?参考答案:OOP解决的是业务模块纵向复用,通过类、继承、多态封装业务差异和通用业务能力,但对于跨模块、跨类的横向通用逻辑无能为力。比如日志、事务,几乎所有业务方法都要用,用OOP只能重复抄写或者用父类继承,会导致代码冗余、侵入性强、维护困难。AOP专门解决横向公共逻辑复用,可以统一拦截所有目标方法,统一增强,完全不侵入原有业务代码,符合开闭原则。OOP:垂直分层,聚焦业务对象AOP:横向切面,聚焦通用行为3、SpringAOP中的核心术语有哪些?分别解释一下参考答案:这是面试高频基础点,核心六个术语:连接点(JoinPoint):可以被拦截的点,Spring中特指所有的方法。理论上所有方法都是连接点。切入点(PointCut):从所有连接点中筛选出来需要真正拦截的方法。不是所有方法都需要增强,切入点就是筛选规则。通知/增强(Advice):拦截方法之后要执行的具体增强逻辑,也就是我们写的通用代码。切面(Aspect):切入点+通知的结合体,一个切面类里面定义拦截规则和增强逻辑。目标对象(Target):被AOP拦截、被增强的原始业务对象。代理对象(Proxy):Spring基于目标对象生成的代理对象,最终程序执行的是代理对象的方法,实现增强。4、SpringAOP有几种通知类型?执行顺序是什么?参考答案:一共五种通知:@Before:前置通知,目标方法执行前执行@AfterReturning:返回通知,目标方法正常执行完毕、无异常时执行@AfterThrowing:异常通知,目标方法抛出异常时执行@After:后置通知,无论方法正常结束还是异常结束,都会执行@Around:环绕通知,包裹目标方法,可手动控制方法执行、前置、后置、异常、返回全流程完整执行顺序:环绕前置逻辑→前置通知→执行目标方法→正常返回则执行返回通知/异常则执行异常通知→后置通知→环绕后置逻辑二、原理机制类(中级核心)5、SpringAOP的底层原理是什么?参考答案:SpringAOP底层核心是动态代理机制,在程序运行期,无需修改源码,动态生成目标对象的代理对象,通过代理对象拦截目标方法,实现功能增强。Spring提供两种动态代理实现,自动适配:JDK动态代理:目标类实现了接口时默认使用,基于接口代理,只能拦截接口定义的方法。CGLIB动态代理:目标类没有实现接口时使用,基于子类继承代理,通过生成目标类的子类重写方法实现拦截。注意:SpringBoot2.0之后默认统一使用CGLIB代理,不再优先JDK代理。6、JDK代理和CGLIB代理的区别?各自优缺点?参考答案:对比维度JDK动态代理CGLIB动态代理依赖条件目标类必须实现接口无需接口,直接继承目标类代理原理基于接口生成代理类基于继承生成子类代理方法限制只能拦截接口中的方法可以拦截类中所有非final方法性能生成代理快,执行略慢生成代理慢,方法执行更快局限性无接口无法使用无法代理final类、final方法、私有方法日常开发中,SpringBoot已经自动适配,不用手动区分,但需要知道final、private方法无法被AOP拦截的根本原因。7、为什么private/final/static方法无法被AOP拦截?参考答案:核心原因:SpringAOP基于动态代理实现,代理的核心是重写或覆盖目标方法,而这三类方法不支持重写:private方法:子类无法继承和重写私有方法,代理类无法覆盖,无法拦截final方法:final方法禁止重写,CGLIB子类无法覆盖该方法static方法:属于类本身,不属于对象,代理是对象级别的代理,无法拦截静态方法补充:如果需要拦截这类方法,普通SpringAOP做不到,需要使用AspectJ编译期织入。8、SpringAOP和AspectJ的区别?参考答案:很多人混淆这两个,其实完全不是一个层级:AspectJ:是一套完整的AOP框架,功能最强,支持编译期织入、类加载期织入、运行期织入,可以拦截所有方法,无方法限制,但是使用复杂,需要额外插件。SpringAOP:是Spring框架简化版的AOP实现,仅仅实现了运行期动态代理,只支持方法拦截,功能精简,适配Spring事务、日志等常用场景,开箱即用。简单总结:SpringAOP是运行期、动态代理、只拦截方法、简单轻量;AspectJ是全周期织入、功能全面、无方法限制、较重。日常Spring开发中@Aspect注解本质是复用了AspectJ的注解规范,但底层依然是SpringAOP的动态代理,不是原生AspectJ。三、实战场景与易错点(高频面试)9、AOP中@Around环绕通知和其他通知的区别?为什么开发中优先用Around?参考答案:普通前置、后置、返回、异常通知都是被动触发,执行顺序固定,无法手动控制目标方法是否执行。而@Around环绕通知是权限最高的通知,可以手动控制:手动决定是否执行目标方法(proceed.joinPoint())可以修改目标方法的入参可以修改目标方法的返回值可以统一捕获处理异常,不用单独写异常通知开发中日志、权限、限流、监控几乎全部用Around,因为一个方法就能搞定所有增强逻辑,更加灵活。10、AOP为什么会出现失效?常见失效场景有哪些?参考答案:AOP失效是面试超级高频问题,核心根源都是没有走代理对象调用方法,直接通过原对象调用,代理不生效。常见场景:同类内部方法调用(自调用):A类的a()方法调用本类的b()方法,如果b()有切面增强,会失效。因为a()执行时用的是this原对象,不是代理对象。方法是private/static/final:前面讲过,无法被代理重写,直接失效。切面类没有交给Spring管理:只加了@Aspect,没加@Component,切面不会生效。切入点表达式书写错误:匹配不到目标方法,导致拦截为空。多切面顺序未指定导致覆盖:多个切面拦截同一个方法,优先级低的切面被覆盖,看起来像失效。自调用失效解决方案:通过Spring上下文获取当前代理对象,用代理对象调用内部方法,或者拆分方法到不同类中。11、多个切面拦截同一个方法,执行顺序如何控制?参考答案:通过@Order注解或者实现Ordered接口指定优先级。规则:数值越小,优先级越高。执行顺序:前置通知:优先级高的先执行后置通知:优先级高的后执行(先进后出)比如事务切面、日志切面共存时,一般设置日志切面优先级高于事务,保证日志先入、后出。12、说说AOP在实际项目中的落地场景参考答案:我项目中常用的AOP场景主要有这几种,都是业务常用:统一日志处理:拦截所有接口方法,统一打印入参、出参、耗时、操作人,不用每个接口手写日志。统一事务控制:Spring事务底层就是AOP,通过切面拦截方法,开启、提交、回滚事务。接口权限校验:自定义注解+AOP,拦截接口,校验用户权限、角色、登录状态。接口限流防刷:通过切面拦截请求,基于IP+接口路径做限流计数。性能监控:统计每个接口、每个方法的执行耗时,慢接口告警。统一异常处理&结果封装:拦截方法异常,统一返回标准响应体。四、源码与进阶面试题(高阶)13、SpringAOP的核心流程是什么?参考答案:整体分为两大阶段:容器启动阶段、方法执行阶段1、容器启动阶段Spring扫描所有带@Aspect的切面类解析切入点表达式,匹配所有符合条件的Bean为需要增强的目标Bean生成对应的代理对象,放入容器2、方法执行阶段调用方法时,实际执行的是代理对象的invoke方法生成拦截器链,排序所有通知按顺序执行前置、目标方法、后置、返回/异常通知14、AOP拦截器链的执行原理?参考答案:当多个通知或多个切面拦截同一个方法时,Spring会将所有通知封装成MethodInterceptor拦截器链,采用责任链模式依次执行。环绕通知、前置、后置通知都会被封装成拦截器,按照优先级排序,通过递归调用proceed方法实现层层穿透,最终执行目标方法,再逐层返回执行后置逻辑。15、AOP和拦截器、过滤器的区别?参考答案:三者经常被问对比,核心是拦截层级不同:Filter过滤器:属于Servlet层级,拦截所有web请求,在Controller接收请求之前执行,依赖Web容器,只能拦截请求响应。Interceptor拦截器:属于SpringMVC层级,拦截Controller方法,在过滤器之后、方法执行前后执行。AOP切面:属于Spring容器层级,拦截任意Bean的方法,包括Service、Dao、自定义Bean,不局限于Web请求,范围最广。执行顺序:过滤器→拦截器→AOP切面→目标方法五、手写实操面试题16、手写一个AOP实现接口日志统一记录参考答案:核心代码思路(面试口述+手写均可)1、自定义日志注解(用于标记需要拦截的接口)2、编写切面类,定义切入点拦截所有Controller接口3、通过环绕通知获取请求信息、入参、方法名、耗时、返回结果4、异常统一捕获,记录异常日志(完整可运行代码贴合面试极简版,无冗余)java
@Aspect
@Component
@Slf4j
publicclassLogAspect{
//拦截所有controller下的所有方法
@Pointcut("execution(*com.xxx.controller..*.*(..))")
publicvoidlogPointCut(){}
@Around("logPointCut()")
publicObjectaround(ProceedingJoinPointjoinPoint)throwsThrowable{
longstart=System.currentTimeMillis();
//获取方法信息
StringmethodName=joinPoint.getSignature().getName();
//获取入参
Object[]args=joinPoint.getArgs();
try{
//执行目标方法
Objectresult=joinPceed();
//记录正常日志
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业技术员考试题库及答案解析大全
- 松原市2026届高三下学期第一次联考生物试卷含解析
- 电除颤护理教学用
- 知识产权竞赛题库
- 2026年水利工程师建筑材料考及答案
- 2026年苏教版三年级英语下册单元综合测试卷(附答案解析)
- 2026年质量员专业管理实务考试《装饰装修质量》真题(后附答案解析)
- 国家开放大学 法学专业 2025年秋季《法律文化》形成性考核作业答案
- T/ZJCFO 0001-2024资产管理 数据资产登记导则
- 成都久玖广告传媒有限公司校园媒体(成都地区)方案
- 2026广东广州市南沙区社区专职工作人员招聘40人考试备考试题及答案解析
- 2026课件:新生儿乳糖不耐受诊断治疗的中国专家共识
- 招聘4人!西宁市世纪职业技术学校招聘编外教师及实训管理员笔试参考题库及答案详解
- 定向钻专项施工方案
- 2026年二级建造师继续教育考试练习题及答案
- (2025)中国肩袖损伤修复围手术期eras护理专家共识课件
- 初中八年级历史 中国特色社会主义道路 大单元教学设计
- 2026年出版专业技术人员职业资格考试(中级)基础知识试题与答案
- 2026年平安银行(上海分行)校园招聘笔试参考试题及答案详解
- 学校食堂员工食品安全培训
- 2026年民兵常识考试试卷及答案
评论
0/150
提交评论