Spring AOP
面向切面编程
1. 定义AOP术语
描述切面的常用术语有通知(active)、切点(pointcut)和连接点(joinpoint)。
通知(active):
通知定义了切面是什么以及何时通知。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring切面可以应用5种类型的通知:
1. 前置通知(Before):在目标方法被调用之前调用通知功能;
2. 后置功能(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
3. 返回通知(After-returning):在目标方法成功执行之后调用通知;
4. 异常通知(After-throwing):在目标方法抛出异常后调用通知;
5. 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为。
连接点(Jion point):
连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面可以利用这些点插入到应用的正常流程之中,并添加新行为。
切点(Poincut):
切点的定义会匹配通知所要织入的一个或多个连接点。
切面(Aspect):
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容—他是什么,在何时和何处完成其功能。
引入(Introduction):
引入允许我们向现有的类添加新方法或属性。
织入(Weaving):
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
编译期、类加载期、运行期。
2. Spring对AOP的支持
并不是所有的AOP框架都是相同的,它们在连接点模型上可能有强弱之分。有些允许在字段修饰符级别应用通知,而另一些只支持与方法调用相关的连接点。它们织入切面的方式和时机也有所不同。但是无论如何,创建切点来定义切面所织入的连接点是AOP框架的基本功能。
Spring提供了4种类型的AOP支持:
1. 基于代理的经典Spring AOP;
2. 纯POJO切面;
3. @AspectJ注解驱动的切面;
4. 注入式AspectJ切面(适用于Spring各个版本)
前三种都是SpringAOP实现的变体。Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。
如果你的AOP需求超过了简单的方法调用(如构造器或属性拦截),那么你需要考虑使用AspectJ来实现切面。在这种情况下,上下文所示的第四种类型能够帮助你将值注入到AspectJ驱动的切面中。
Spring通知时Java编写的。
AspectJ与之相反支持基于注解的切面,但是AspectJ是以Java语言扩展的方式实现的,我们需要学新的工具和语法。但优点是获得更强大和细粒度的控制。
Spring在运行时通知对象
Spring只支持方法级别的连接点
3. 通过切点来选择连接点
Spring仅支持AspectJ切点指示器(pointcut designator)的一个子集。
在Spring中尝试使用AspectJ其他指示器时,将会抛出IllegalArgument-Exception异常。