Spring AOP 面试难点总结

JAVA herman 4112浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

Spring AOP 经常是各大面试官必提的知识点。我这里总结了 AOP 的各种关键知识点,希望能帮助到大家。

AOP

它能做什么:事务安全日志缓存.

以前都是OOP的思想下编程模型,一切都是面向对象,显得井然有序,但某一天发现许多对象逻辑里有相同的代码逻辑或片段,比如记录日志、用户权限验证,他们都是做同样的事,这样,第一是觉得这样的代码对于有洁癖的人看起来是很反感的,再者若这些代码涉及改动时所有用到的点都要改。但又发现这些需要植入的地方只是一些关键地方。

那么,是否有一种方法使这些方法执行前或后再做点什么呢。方法是有的,目前比如有直接字节码操作、代理技术等来实现,字节码技术就是在编译时通过修改字节码的方式将需要植入的逻辑编译进去,只是我们编写时无需编写这些逻辑,这样的编译植入过程交由一个编译工具去做。代理技术与直接字节码操作技术的不同点在于它会另外生成一个代理类对目标类进行代理,然后在方法前或后加入希望的逻辑。

Aspect

切面定义,切面里面包含了对植入点,植入逻辑的定义。Aspect是一个切面的定义,一个切面里面定义了切入点(JoinPoint)、切入方式(PointCut)、切入点的逻辑(Advice),一个@Aspect类被解析成一个切面。

Advisor

PointCut和Advice的holder,PointCut是用来组织切面的,Advice是用来在切面上执行动作的,Advice有多种动作方式如前置、后置、前后置处理等方式。

n'gPointcut

对方法的匹配,在Spring中一般用表达式表达是表示 [return type] [class and method name]([args]),匹配表达式指定了哪些地方会被植入切面逻辑

Joinpoint

具体的逻辑点。

Advice

是对具体植入动作行为的定义,也包括拦截的方式
通知,这里就是定义要植入逻辑的地方,植入也按执行时间分为许多种

  1. BeforeAdivce 前置通知
  2. AfterAdivce 后置通知
  3. Around 环绕通知
  4. ThrowAdvice 异常通知

AOP植入原理

  1. 初始化BeanDefinition
  2. createBean
  3. initBean
  4. find Advisors
  5. match JoinPoint
  6. create Proxy

找到 Advisors。

BeanFactoryAdvisorRetrivelHelper.findAdvisorBeans();

AopUtils

// 找到匹配的切面
findAdvisorsThatCanApply(advisors, target);

// 判断 beanClass 是否可以被这个切面代理
AopUtils.canApply(pointCut, beanClass);
    MethodMatcher.matches
    AnnotationMethodMatcher   // 注解标记的解析,有目标注解的
    AspectJExpressionPointcut // 表达式标记的切面匹配

表达式

Spring使用AspectJ定义的切面表达式,虽然使用了AspectJ的AOP规范,但并未使用AspectJ的实现,AspectJ是静态编译,有自己的DSL,使用者需要学习其AOP语言,但是学习成本并不大,只是一些对切入点的描述定义,详细编写语法可见AspectJ文档

代理

代理分为动态代理和静态代理,动态代理指的是jdk动态代理,但jdk动态代理必须是基于接口的,利用了jdk动态生成内存字节码代理类的方式;另一只就是CGLIB静态代理,这种代理适用于对任何类的代理,它是利用继承的能力,代理原有类的方法,并植入逻辑

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Spring AOP 面试难点总结