而Spring借鉴了AspectJ很多非常有用的做法,融合了AspectJ实现AOP的功能。但Spring AOP本质上底层还是动态代理,所以Spring AOP是不需要有专门的编辑器的~
1.4AOP的术语嗯,AOP搞了好几个术语出来~~两本书都有讲解这些术语,我会尽量让大家看得明白的:
连接点(Join point):
能够被拦截的地方:Spring AOP是基于动态代理的,所以是方法拦截的。每个成员方法都可以称之为连接点~
切点(Poincut):
具体定位的连接点:上面也说了,每个方法都可以称之为连接点,我们具体定位到某一个方法就成为切点。
增强/通知(Advice):
表示添加到切点的一段逻辑代码,并定位连接点的方位信息。
简单来说就定义了是干什么的,具体是在哪干
Spring AOP提供了5种Advice类型给我们:前置、后置、返回、异常、环绕给我们使用!
织入(Weaving):
将增强/通知添加到目标类的具体连接点上的过程。
引入/引介(Introduction):
引入/引介允许我们向现有的类添加新方法或属性。是一种特殊的增强!
切面(Aspect):
切面由切点和增强/通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。
在《Spring 实战 (第4版)》给出的总结是这样子的:
通知/增强包含了需要用于多个应用对象的横切行为;连接点是程序执行过程中能够应用通知的所有点;切点定义了通知/增强被应用的具体位置。其中关键的是切点定义了哪些连接点会得到通知/增强。
总的来说:
这些术语可能翻译过来不太好理解,但对我们正常使用AOP的话影响并没有那么大~~看多了就知道它是什么意思了。
1.5Spring对AOP的支持Spring提供了3种类型的AOP支持:
基于代理的经典SpringAOP
需要实现接口,手动创建代理
纯POJO切面
使用XML配置,aop命名空间
@AspectJ注解驱动的切面
使用注解的方式,这是最简洁和最方便的!
二、基于代理的经典SpringAOP这部分配置比较麻烦,用起来也很麻烦,这里我就主要整理一下书上的内容,大家看看了解一下吧,我们实际上使用Spring AOP基本不用这种方式了!
首先,我们来看一下增强接口的继承关系图:
可以分成五类增强的方式:
Spring提供了六种的切点类型:
切面类型主要分成了三种:
一般切面
切点切面
引介/引入切面
一般切面,切点切面,引介/引入切面介绍:
对于切点切面我们一般都是直接用就好了,我们来看看引介/引入切面是怎么一回事:
引介/引入切面是引介/引入增强的封装器,通过引介/引入切面,可以更容易地为现有对象添加任何接口的实现!
继承关系图:
引介/引入切面有两个实现类:
DefaultIntroductionAdvisor:常用的实现类
DeclareParentsAdvisor:用于实现AspectJ语言的DeclareParent注解表示的引介/引入切面
实际上,我们使用AOP往往是Spring内部使用BeanPostProcessor帮我们创建代理。
这些代理的创建器可以分成三类:
基于Bean配置名规则的自动代理创建器:BeanNameAutoProxyCreator
基于Advisor匹配机制的自动代理创建器:它会对容器所有的Advisor进行扫描,实现类为DefaultAdvisorAutoProxyCreator
基于Bean中的AspectJ注解标签的自动代理创建器:AnnotationAwareAspectJAutoProxyCreator
对应的类继承图: