Spring框架学习【AOP基础】(三)

2014-11-24 03:05:56 · 作者: · 浏览: 4
axException { this.compiledPatterns = compilePatterns(patterns);
  • } //将给定的模式字符串数组初始化为编译时要排除的正则表达式模式
  • protected void initExcludedPatternRepresentation(String[] excludedPatterns) throws PatternSyntaxException { this.compiledExclusionPatterns = compilePatterns(excludedPatterns);
  • } //使用正则表达式匹配给定的名称
  • protected boolean matches(String pattern, int patternIndex) { Matcher matcher = this.compiledPatterns[patternIndex].matcher(pattern);
  • return matcher.matches(); }
  • //使用要排除的正则表达式匹配给定的名称 protected boolean matchesExclusion(String candidate, int patternIndex) {
  • Matcher matcher = this.compiledExclusionPatterns[patternIndex].matcher(candidate); return matcher.matches();
  • } //将给定的字符串数组编译为正则表达的模式
  • private Pattern[] compilePatterns(String[] source) throws PatternSyntaxException { Pattern[] destination = new Pattern[source.length];
  • for (int i = 0; i < source.length; i++) { destination[i] = Pattern.compile(source[i]);
  • } return destination;
  • } }

    从上面的源码分析中,我们可以看到,最简单的使用正则表达式匹配的Pointcut切入点基本功能就是根据正则表达式判断方法名等是否匹配。

    8.Advisor通知器:

    当完成对目标对象方法的增强行为操作(Advice)和切入点Point的设计开发之后,需要一个对象将目标对象、增强行为和切入点三者结合起来,通知器Advisor就是一个实现这个功能的对象,即通过Advisor通知器,可以定义那些目标对象的那些方法在什么地方使用这些增加的行为。

    (1).Advisor通知器:

    Advisor通知器的源码如下:

    [java] view plaincopy
    1. public interface Advisor { //获取切面的通知Advice
    2. Advice getAdvice(); //判断这个通知是否和某个特定的实例对象相关
    3. boolean isPerInstance(); }

      (2). Advisor通知器的实现类DefaultPointcutAdvisor:

      查看Advisor通知器的继承体系,发现Advisor的实现类很多,我们以最常用的DefaultPointcutAdvisor为例,分析通知器的工作原理。

      a. DefaultPointcutAdvisor源码如下:

      [java] view plaincopy
      1. public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable { //默认切入点
      2. //Pointcut.TRUE在切入点中的定义为:Pointcut TRUE = TruePointcut.INSTANCE; private Pointcut pointcut = Pointcut.TRUE;
      3. //无参构造方法,创建一个空的通知器 public DefaultPointcutAdvisor() {
      4. } //创建一个匹配所有方法的通知器
      5. public DefaultPointcutAdvisor(Advice advice) { this(Pointcut.TRUE, advice);
      6. } //创建一个指定切入点和通知的通知器
      7. public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut;
      8. setAdvice(advice); }
      9. //为通知设置切入点 public void setPointcut(Pointcut pointcut) {
      10. this.pointcut = (pointcut != null pointcut : Pointcut.TRUE); }
      11. //获取切入点 public Pointcut getPointcut() {
      12. return this.pointcut; }
      13. public String toString() { return getClass().getName() + ": pointcut [" + getPointcut() + "]; advice [" + getAdvice() + "]";
      14. } }

        上述源码中,通知器的默认切入点是Pointcut.TRUE,Pointcut.TRUE在切入点中的定义为:Pointcut TRUE = TruePointcut.INSTANCE;

        b.TruePointcut:

        TruePointcut作用通知器默认的切入点,其主要功能是配置默认的类过滤器和方法匹配器,即定义Spring AOP对于哪些类的哪些方法其作用,源码如下:

        [java] view plaincopy
        1. class TruePointcut implements Pointcut, Serializable { //INSTANCE是TruePointcut类的一个常量单件,即整个应用中只有这个一个,
        2. //不会创建第二个实例对象,确保该实例对象的唯一性,单态模型 public static final TruePointcut INSTANCE = new TruePointcut();
        3. //单态模式构造方法 private TruePointcut() {
        4. } //获取切入点的类过滤器
        5. public ClassFilter getClassFilter() { return ClassFilter.TRUE;
        6. } //获取切入点的方法匹配器
        7. public MethodMatcher getMethodMatcher() { return MethodMatcher.TRUE;
        8. } //获取单态模式对象的方法
        9. private Object readResolve() { return INSTANCE;
        10. } public String toString() {
        11. return "Pointcut.TRUE"; }
        12. }

          从TruePointcut的源码我们看到,切入点使用TrueClassFilter作为类过滤器,匹配任意的类,使用TrueMethodMatcher作为方法匹配器,匹配任意的方法。下面我们继续分析TrueClassFilter类过滤器和TrueMethodMatcher方法匹配器。

          c.TrueClassFilter:

          TrueClassFilter作为默认切入点的默认类过滤器,主要告诉切入点对哪些类进行增强,源码如下:

          [java] view plaincopy
          1. class TrueClassFi