Spring 自定义切入点

  • Post author:
  • Post category:其他


Spring Aop 强大之处你可以自己定义切入点并且对切入点进行合并使其成为新的切入点。这给我们很大的自由空间,任我们在其中翱翔。。。闲话少说。这里我就简单的介绍下如何自定义切入点。

Spring 自定义切入点只需要继承Pointcut 接口。它提供了两个方法:ClassFilter getClassFilter()和MethodMatcher getMethodMatcher()方法。通过方法我们可以很容易的看出第一个方法是对类进行判别是否需要织入通知,而第二个方法是对方法进行判别是否需要织入通知。当然它不仅仅只有如此而已,这我会在下面提及到。

首先说的是ClassFilter 接口,虽然它非常的简单,并且实用性并不是非常的高(原因在于你在实现Spring Aop 时总是要定义目标对象的,那么如果该对象不实现进行Aop 你不进行定义便可。它的作用很可能是在对切入点进行合并时用到),但不管怎么说了解总是没有错的。ClassFilter 接口只提供了一个方法:boolean matcher(Class cls)。可以看出该类是通过类名来判断是否对该类进行织入通知的。由于这并不是常被用到的一个方法。Spring 提供了一个实现类表明任何类都可以织入通知,ClassFilter.TRUE。

接着就是重头戏MethodMatcher 接口。它提供了3个方法,我们一个一个来说。

首先是matches(Method,Class),看到这个方式当时我突然想到Class参数传过来的是什么呢,它是我们在Spring 的配置文件中设置的Aop 的目标对象。也就是说这个方法完全可以去替代ClassFilter 接口的matcher 方法,经过测试我发现这的确可以做到,Method参数是这个方法就是判别是否对该方法进行通知所需要的判别参数,相信Spring的 NameMatchMethodPointcut 和RegexpMethodPointcut 静态切入点都是通过它来实现的。这里我想强调一点某些Spring 书中说道matches(Method,Class)和isRunntime 方法只被调用一次,这显然是错误的。他们调用的次数是于Spring ProxyFactoryBean 类的proxyInterfaces 设置的接口有关。也就是说如果设置的接口定义方法超过一个,那么这两个方法必将会运行两次。书中所说的一次是说:对方法进行判别是否需要织入通知只进行一次操作。

接着isRunntime 方法。它是设置切入点是否是动态切入点。需要指出的是如果matches(Method,Class)返回为fasle 的话,则该方法不会再被调用。

最后就是matches(Method,Class,Object[])方法,该方法只有当前面的两个方法都返回true时才运行并且只有该方法返回true,通知才会织入其中。并且这个方法每次方法调用时都会被调用。因此效率很低只有在不得不用得时候才会用到该方法。