从上面的源码分析中,我们可以看到,最简单的使用正则表达式匹配的Pointcut切入点基本功能就是根据正则表达式判断方法名等是否匹配。
8.Advisor通知器:
当完成对目标对象方法的增强行为操作(Advice)和切入点Point的设计开发之后,需要一个对象将目标对象、增强行为和切入点三者结合起来,通知器Advisor就是一个实现这个功能的对象,即通过Advisor通知器,可以定义那些目标对象的那些方法在什么地方使用这些增加的行为。
(1).Advisor通知器:
Advisor通知器的源码如下:
[java] view plaincopy- public interface Advisor { //获取切面的通知Advice
- Advice getAdvice(); //判断这个通知是否和某个特定的实例对象相关
- boolean isPerInstance(); }
(2). Advisor通知器的实现类DefaultPointcutAdvisor:
查看Advisor通知器的继承体系,发现Advisor的实现类很多,我们以最常用的DefaultPointcutAdvisor为例,分析通知器的工作原理。
a. DefaultPointcutAdvisor源码如下:
[java] view plaincopy- public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable { //默认切入点
- //Pointcut.TRUE在切入点中的定义为:Pointcut TRUE = TruePointcut.INSTANCE; private Pointcut pointcut = Pointcut.TRUE;
- //无参构造方法,创建一个空的通知器 public DefaultPointcutAdvisor() {
- } //创建一个匹配所有方法的通知器
- public DefaultPointcutAdvisor(Advice advice) { this(Pointcut.TRUE, advice);
- } //创建一个指定切入点和通知的通知器
- public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut;
- setAdvice(advice); }
- //为通知设置切入点 public void setPointcut(Pointcut pointcut) {
- this.pointcut = (pointcut != null pointcut : Pointcut.TRUE); }
- //获取切入点 public Pointcut getPointcut() {
- return this.pointcut; }
- public String toString() { return getClass().getName() + ": pointcut [" + getPointcut() + "]; advice [" + getAdvice() + "]";
- } }
上述源码中,通知器的默认切入点是Pointcut.TRUE,Pointcut.TRUE在切入点中的定义为:Pointcut TRUE = TruePointcut.INSTANCE;
b.TruePointcut:
TruePointcut作用通知器默认的切入点,其主要功能是配置默认的类过滤器和方法匹配器,即定义Spring AOP对于哪些类的哪些方法其作用,源码如下:
[java] view plaincopy- class TruePointcut implements Pointcut, Serializable { //INSTANCE是TruePointcut类的一个常量单件,即整个应用中只有这个一个,
- //不会创建第二个实例对象,确保该实例对象的唯一性,单态模型 public static final TruePointcut INSTANCE = new TruePointcut();
- //单态模式构造方法 private TruePointcut() {
- } //获取切入点的类过滤器
- public ClassFilter getClassFilter() { return ClassFilter.TRUE;
- } //获取切入点的方法匹配器
- public MethodMatcher getMethodMatcher() { return MethodMatcher.TRUE;
- } //获取单态模式对象的方法
- private Object readResolve() { return INSTANCE;
- } public String toString() {
- return "Pointcut.TRUE"; }
- }
从TruePointcut的源码我们看到,切入点使用TrueClassFilter作为类过滤器,匹配任意的类,使用TrueMethodMatcher作为方法匹配器,匹配任意的方法。下面我们继续分析TrueClassFilter类过滤器和TrueMethodMatcher方法匹配器。
c.TrueClassFilter:
TrueClassFilter作为默认切入点的默认类过滤器,主要告诉切入点对哪些类进行增强,源码如下:
[java] view plaincopy- class TrueClassFi