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异常。

  

posted @ 2017-05-16 13:53  wenxudong  阅读(151)  评论(0编辑  收藏  举报