上篇文章我们简单的介绍了下AOP相关的术语,这篇中我们主要来看下怎么在Spring中实现的。
一、Spring提供了4中各具特色的AOP支持
前面三种都是Spring基于代理的AOP变体,所以Spring对AOP的支持局限于方法的拦截。如果超过这个拦截的需求我们就需要用到AspectJ切面了。
二、Spring在运行时通知对象。Spring在运行期把切面织入到Spring管理的Bean中如图所示
代理类把真正的目标类封装起来,当代理拦截到对方法的调用时就先会执行切面的逻辑,再根据情况调用目标bean方法。
三、通过切点选择链接点
首先我们先来看下Spring对AspectJ切点支持的指示器
只支持这几种,如果想使用其他AspectJ指示器就会出现异常。
其实这么多 指示器我们只需要关注具体执行匹配的指示器就可其实就是execution指示器。
其他的指示器只是用来限制匹配的。简单来说就是来帮助execution的辅助工具。
四、具体实现
1编写切点
假设我们用途中所编写的接口中的perform方法触发的通知。可以这样设置excecution(* concert.Performance.perform(..))
我们可以从图中看到具体的执行方式 *代表的是可以返回任意类型,我们不需要关注方法返回的是什么。
并且在里面我们指定了方法所在的类与方法名称,并且还可以制定参数。当然在这里我们还可以来限制切点的范围。正如我们在前面所介绍的指示器一样
注意当我们一块使用时可能会形成and关系、or、not关系。我们在程序中应该用&&、||、!来带起。
2切点中选择bean
除了我们在介绍的指示器外,Spring还引入了一个新的bean()指示器。可以让我们在使用bean的ID来标识bean.
在这个途中我们就是希望在执行方法的时候应用通知,但是限定的bean为woodstock。
3使用注解创建切面
我们在程序中对类Audience进行了@AspectJ标注了注解。该注解标识不仅仅是一个POJO,还是一个切面。在这里我们还可以用其他注解来定义通知。如图所示
在执行表演的方法前后可以执行的操作通知。
上面的一个定义切点用了好几次,那么我们可以使用@Pointcut注解来解决掉整体麻烦的事情。
直接指定了切点,我们就可以通过其他注解指定方法就能解决掉通知的问题。
关于切面的信息我们先说到这里。下次继续说这个切面的问题。