Spring主要提供了三种切入点(Pointcut)的实现:静态切入点、动态切入点和自定义切入点。
(1)静态切入点
它只限于给定的方法和目标类,而不考虑方法的参数。Spring在调用静态切入点时,只在第一次的时候计算静态切入点的位置,然后把它缓存起来,以后就不需要再进行计算。
使用org.springframework.aop.support.RegexpMethodPointcut可以实现静态切入。RegexpMethodPointcut是一个通用的正则表达式切入点,它是通过jakarta ORO来实现的,所以需要把 jakarta-oro-2.0.8.jar加入到ClassPath中去。
示例:
<bean id="wl" class="org.springframework.aop.support.RegexpMethodPointcut">
<property name="patterns">
<!--设定切入点-->
<list>
<value>.*save.* </value> //表示所有以save开头的方法都是切入点
<value>.*do.* </value> //表示所有以do开头的方法都是切入点
</list>
</property>
</bean>
(2)动态切入点
它与静态切入点的区别是:它不仅仅只限定于给定的方法和类,它还可以指定方法的参数。由于参数的变化性,所以它不可以缓存,需要每次调用的时候都进行计算,因此使用动态切入点有很大的性能损耗。
当切入点需要在执行时,根据参数值来调用通知时,就需要使用动态切入点。Spring提供了一个内建的动态切入点:控制流切入点。此切入点匹配基于当前线程的调用堆栈。开发人员只有在当前线程执行时,找到特定的类和方法,才返回true。
其实大多数切入点,可以使用静态切入点,所以很少有机会创建动态切入点。
(3)自定义切入点
因为spring 的切入点时java类,而不是语言特性(如AspectJ),所以可以自定义切入点。由于AOP还没有完全成熟,所以没有详细的解释动态切入点和自定义切入点。