Spring AOP的术语汇总

前言

原本我以为这部分东西是没什么好说的,结果上周面试被问到了,东扯西扯半天,只说了个大概,这部分原本能够说的更好的,因此写个文章来总结下,说不定有机会还用得上面试

首先声明一点,本文讲的是Spring AOP中的术语,是AOP框架的定义,因此不要将AOP与动态代理混为一谈,AOP是一种思想,而动态代理是一种解决方案正则表达式

为了下文能更形象地描述,这里预设一个AOP的场景:老师上课前须要黑板是干净的,也就是说须要有人来帮忙擦黑板框架

术语

这里将术语分为两类,一类是对象术语,另外一类是行为术语。对象术语指的是用于描述AOP中的各个对象部分,而行为术语指的是在AOP实现过程当中涉及到的具体行为代理

对象术语

通知(Advice)

通知指的是AOP在正常流程以外额外要执行的动做,也就是经过AOP为目标方法[1]新增的内容。根据前言中预设的场景,擦黑板这一行为就被叫作通知code

确切地来讲,通知描述了在正常流程以外额外要执行的具体工做,以及什么时候执行这个工做。根据通知执行时间的不一样,Spring AOP中能够应用如下五种类型的通知对象

  • 前置通知(Before):在目标方法被调用前执行的行为
  • 后置通知(After):在目标方法执行完成后执行的行为,不能获取到方法的输出
  • 返回通知(After-returning):在目标方法成功执行后执行的行为,能够获取到方法的输出
  • 异常通知(After-throwing):在目标方法抛出异常后执行的行为
  • 环绕通知(Around):包裹了目标方法,能够在其执行先后执行自定义的行为

链接点(Join point)

链接点指的是应用通知的时机,好比老师上课前这一时间点就是链接点。代码能够利用这些点插入本来的正常方法流程中,以添加新的行为编译器

可能有人会有疑问,不是刚刚说通知也表示了执行的时机,那链接点的定义不是重复了吗?数学

通知描述了在正常流程以外额外要执行的具体工做,以及什么时候执行这个工做it

我我的理解是这样的,这两个地方并不冲突。就比方说咱们告诉别人“我吃早饭”,可是他们只知道咱们吃的是早饭,重点是饭,而链接点则是将“早”这个概念抽象出来,好比“我在早上吃早饭”,重点就在“早”而不是“饭”。也就说是,通知的重点是内容,而链接点的则是将通知的应用时机细分出来io

切点(Pointcut)

对于咱们在方法正常流程以外执行的额外操做而言,通知定义了这些操做执行的内容时机切点则是定义了这些操做执行的位置

对于咱们预设的那个场景而言,不能只粗略说是在“老师”“上课”前擦黑板,而应该指明是什么老师,上什么课,好比咱们能够说“全部一年级老师上政治课”前擦黑板,或是“全部姓刘的老师上数学课”前擦黑板

AOP会根据切点的定义,来匹配一个或多个链接点,而后应用咱们的通知。咱们一般会使用明确的类/方法名,或是正则表达式来指定切点。根据AOP框架的不一样,切点匹配的自由度也会不一样

切面(Aspect)

切面是切点通知的结合,定义了咱们的功能在什么时候、何处、以及如何执行

切面定义了AOP的核心内容,在上述场景中,切面知道本身要作什么(擦黑板),在哪作(A老师上B课的教室),以及什么时候作(上课前)

行为术语

引入(Introduction)

引入指的向现有的类中添加新的方法或属性。咱们能够将新的方法或属性引入到目标类中,这样目标类就具备了新的方法,同时还不用修改现有具体类的定义

织入(Weaving)

相比与引入,织入的概念更为重要。织入指的是将切面应用到目标对象,在这个过程当中会生成新的代理对象

织入的执行的时机有如下几个[2]

  • 编译期:在目标类被编译时进行织入,须要依赖于特殊的编译器。AspectJ的织入编译器就采用的这种方式
  • 类加载期:在目标类被加载到JVM时进行织入,须要依赖于特殊的类加载器。这种方式会在目标类被引入应用前加强目标类的字节码
  • 运行期:在应用运行的某一具体时刻进行织入。在这种状况下,AOP容器会为目标对象动态地建立一个代理对象,Spring AOP就采用的这种方式

总结

以上这些就是AOP中的经常使用术语,这些术语虽然你可能根本用不到,可是必定要知道,能明白代码中的某个部分属于AOP的哪一个部分,不然永远都会是一个不断写简单的业务代码的码农而已

最后总结一下对象术语,咱们完整的场景以下:

王老师在上语文课前,须要有人来擦黑板

在这个场景中,各自对象表明的内容以下:

  • 被加强的方法:王老师的语文课
  • 目标方法所在类:王老师
  • 通知(前置通知):作某事前擦黑板,重点是擦黑板这一行为
  • 链接点:老师上课前的时间,并不肯定是哪些老师上哪门课前
  • 切点:王老师上语文课前这一时间点
  • 切面:在王老师上语文课前擦黑板

  1. 目标方法指的是AOP所切入的方法,在上述场景中,老师上课这一行为就是目标方法 ↩︎

  2. 参考《Spring in Action》 ↩︎

相关文章
相关标签/搜索