原本我以为这部分东西是没什么好说的,结果上周面试被问到了,东扯西扯半天,只说了个大概,这部分原本能够说的更好的,因此写个文章来总结下,说不定有机会还用得上面试
首先声明一点,本文讲的是Spring AOP中的术语,是AOP框架的定义,因此不要将AOP与动态代理混为一谈,AOP是一种思想,而动态代理是一种解决方案正则表达式
为了下文能更形象地描述,这里预设一个AOP的场景:老师上课前须要黑板是干净的,也就是说须要有人来帮忙擦黑板框架
这里将术语分为两类,一类是对象术语,另外一类是行为术语。对象术语指的是用于描述AOP中的各个对象部分,而行为术语指的是在AOP实现过程当中涉及到的具体行为代理
通知指的是AOP在正常流程以外额外要执行的动做,也就是经过AOP为目标方法[1]新增的内容。根据前言中预设的场景,擦黑板这一行为就被叫作通知code
确切地来讲,通知描述了在正常流程以外额外要执行的具体工做,以及什么时候执行这个工做。根据通知执行时间的不一样,Spring AOP中能够应用如下五种类型的通知对象
链接点指的是应用通知的时机,好比老师上课前这一时间点就是链接点。代码能够利用这些点插入本来的正常方法流程中,以添加新的行为编译器
可能有人会有疑问,不是刚刚说通知也表示了执行的时机,那链接点的定义不是重复了吗?数学
通知描述了在正常流程以外额外要执行的具体工做,以及什么时候执行这个工做it
我我的理解是这样的,这两个地方并不冲突。就比方说咱们告诉别人“我吃早饭”,可是他们只知道咱们吃的是早饭,重点是饭,而链接点则是将“早”这个概念抽象出来,好比“我在早上吃早饭”,重点就在“早”而不是“饭”。也就说是,通知的重点是内容,而链接点的则是将通知的应用时机细分出来io
对于咱们在方法正常流程以外执行的额外操做而言,通知定义了这些操做执行的内容和时机,切点则是定义了这些操做执行的位置
对于咱们预设的那个场景而言,不能只粗略说是在“老师”“上课”前擦黑板,而应该指明是什么老师,上什么课,好比咱们能够说“全部一年级老师上政治课”前擦黑板,或是“全部姓刘的老师上数学课”前擦黑板
AOP会根据切点的定义,来匹配一个或多个链接点,而后应用咱们的通知。咱们一般会使用明确的类/方法名,或是正则表达式来指定切点。根据AOP框架的不一样,切点匹配的自由度也会不一样
切面是切点和通知的结合,定义了咱们的功能在什么时候、何处、以及如何执行
切面定义了AOP的核心内容,在上述场景中,切面知道本身要作什么(擦黑板),在哪作(A老师上B课的教室),以及什么时候作(上课前)
引入指的向现有的类中添加新的方法或属性。咱们能够将新的方法或属性引入到目标类中,这样目标类就具备了新的方法,同时还不用修改现有具体类的定义
相比与引入,织入的概念更为重要。织入指的是将切面应用到目标对象,在这个过程当中会生成新的代理对象
织入的执行的时机有如下几个[2]:
AspectJ
的织入编译器就采用的这种方式以上这些就是AOP中的经常使用术语,这些术语虽然你可能根本用不到,可是必定要知道,能明白代码中的某个部分属于AOP的哪一个部分,不然永远都会是一个不断写简单的业务代码的码农而已
最后总结一下对象术语,咱们完整的场景以下:
王老师在上语文课前,须要有人来擦黑板
在这个场景中,各自对象表明的内容以下: