- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
SpringAOP面试题及答案
1.先说说你理解的SpringAOP吧?它解决了开发中的什么问题?
答案:
SpringAOP是基于动态代理的面向切面编程框架,核心是把项目里重复的逻辑(比如日志、事务、权限校验)抽成“切面”,在不修改原有业务代码的前提下,通过“织入”的方式作用到业务方法上。
比如之前做订单系统时,每个接口都要记录请求参数、返回值和耗时,要是每个方法里都写日志代码,不仅冗余还难维护。用AOP抽个日志切面,只需要配置哪些方法要切,就能自动加日志,后期要改日志格式,改切面就行,不用动业务代码——这就是解耦重复逻辑和核心业务,符合“开闭原则”。
2.SpringAOP里的核心术语(比如切面、通知、切入点这些),你能通俗讲下吗?
答案:
不用记复杂定义,结合实际场景说更清楚:
切面(Aspect):就是你抽出来的重复逻辑类,比如LogAspect(日志切面)、TransactionAspect(事务切面),里面包含了要执行的逻辑和“什么时候执行”“作用在哪些方法”的规则。
通知(Advice):切面里的具体逻辑方法,比如LogAspect里的logBefore(前置日志)、logAfter(后置日志),决定了“什么时候执行”(比如方法执行前、执行后)。
切入点(Pointcut):定义“作用在哪些方法”的规则,比如“所有controller包下的public方法”“加了@Log注解的方法”,用表达式(比如execution、@annotation)描述。
连接点(JoinPoint):所有可能被切面作用的方法(比如项目里所有方法都是潜在连接点),但只有符合切入点规则的,才会被实际织入。
目标对象(Target):被切面作用的原始业务对象(比如OrderService实例),AOP会给它生成代理对象来执行增强逻辑。
代理对象(Proxy):Spring生成的、包装了目标对象的对象,实际调用时是通过代理对象先执行增强逻辑,再调用目标方法。
3.SpringAOP底层用的什么动态代理?JDK动态代理和CGLIB有啥区别?实际项目里怎么选?
答案:
SpringAOP默认用两种动态代理,选哪种看目标对象:
JDK动态代理:只能代理实现了接口的类。原理是在运行时生成一个“实现了目标接口”的代理类,代理类里会调用InvocationHandler(里面写增强逻辑),再转发到目标对象的方法。
CGLIB动态代理:不用接口,直接代理类。原理是通过ASM字节码框架,在运行时生成目标类的“子类”,子类里重写目标方法(加增强逻辑),但要注意:目标类不能是final的,目标方法也不能是final的(不然子类没法重写)。
实际选择:
Spring3.x之后默认逻辑:如果目标对象实现了接口,就用JDK代理;没实现接口,就用CGLIB。
SpringBoot2.x之后有个小变化:如果目标对象是接口的实现类,但你配置了xy-target-class=true,会强制用CGLIB(比如有些场景下,目标类有非接口方法要增强,JDK代理搞不了)。
项目里一般不用刻意改,除非有特殊需求:比如老系统里有些类没实现接口,还想切它的方法,就靠CGLIB;如果是纯接口编程(比如微服务里的Feign接口),就用JDK代理。
4.SpringAOP有哪些通知类型?它们的执行顺序是怎样的?如果方法抛异常了,哪些通知会执行?
答案:
常用的有5种通知,执行顺序要分“正常情况”和“异常情况”:
(1)5种通知类型
前置通知(@Before):目标方法执行前执行;
后置返回通知(@AfterReturning):目标方法正常返回后执行(抛异常就不执行);
后置最终通知(@After):不管目标方法成功还是失败,最后都会执行(类似try-catch里的finally);
异常通知(@AfterThrowing):目标方法抛异常时执行;
环绕通知(@Around):最灵活的通知,能包裹目标方法,既可以在执行前做操作,也能在执行后做操作,还能控制目标方法是否执行(比如权限校验不通过就不调用目标方法)。
(2)执行顺序
正常情况:环绕前置(@Around里调用proceed()之前)→前置通知(@Before)→目标方法执行→环绕后置(@Around里调用proceed()之后)→后置返回通知(@AfterReturning)→后置最终通知(@After);
异常情况:环绕前置→前置通知→目标方法执行(抛异常)→环绕异常(@Around里的catch块)→后置异常通知
您可能关注的文档
最近下载
- 风险管理与金融机构第二版课后习题答案+(修复的)()详细分析.doc VIP
- 白砂糖仓库管理方案范本.docx VIP
- 初中语文2024届中考成语专项练习(共20道选择题,附参考答案).doc VIP
- 最新版个人征信报告模板(word版-可编辑-带水印).docx VIP
- 部编版语文三年级下册第三单元3单元整体作业设计.docx VIP
- 新22J04-1 内装修一(墙面、吊顶)参考图集.docx VIP
- GB50278-2010 起重设备安装工程施工及验收规范.docx VIP
- 达索BIOVIA COSMOtherm 2020 用户指南.pdf
- 智慧养殖在线监测系统微型水质自动监测系统使用说明书.pdf
- 铜、铅、锌、银、镍、钼矿地质勘查规范.pdf VIP
文档评论(0)