Spring的AOP的Pointcut的三种实现

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还没有完全成熟,所以没有详细的解释动态切入点和自定义切入点。

猜你喜欢

转载自wang-liang.iteye.com/blog/1995478