Spring的切入点(一)

2008-08-11 10:41:55.0     浏览:516     来源:中国IT实验室
关键词:  Spring     切入点  

Pointcut即切入点,用于配置切面的切入位置。由于Spring中切入点的粒度是方法级,因此在Spring AOP中Pointcut的作用是配置哪些类中哪些方法在我们定义的且入点之内、哪些方法应该被过滤排除。Spring的Pointcut分为静态Pointcut、动态Pointcut和用户自定义Pointcut三种,其中静态Pointcut只是需要考虑类名、方法名;动态Pointcut除此之外,还要考虑方法的参数,以便在运行时可以动态的确定切入点的位置。

1、 静态Pointcut

静态即意味着不变,例如方法和类的名称。因此我们可以根据类和方法的签名来判定那些类的哪些方法在我们定义的切入点之内、哪些应该被过滤排除。

Spring中定义中如下几个静态Pointcut的实现类,介绍如下:

1、 NameMatchMethodPointcut:只能对方法名进行判别的静态Pointcut实现类。

使用范例如下:

1 <bean id="NameMatchMethodPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
2 <property name="mappedNames">
3 <list>
4 <value>pos*</value>
5 <value>start</value>
6 </list>
7 </property>
8 </bean>
9
注意:post*表示包含所有以pos开始的方法。(大小写敏感)。

此外,NameMatchMethodPointcut还暴露了ClassFilter类型的classFilter属性,可以用于指定ClassFilter接口的实现类来设置类过滤器。ClassFilter接口的定义如下:

1 package org.springframework.aop;
2
3 public interface ClassFilter {
4
5 boolean matches(Class clazz);
6 ClassFilter TRUE = TrueClassFilter.INSTANCE;
7
8 }
9
其中matches方法用于类的匹配,参数clazz是需要匹配的目标类,匹配成功则返回true.

2、 JdkRegexpMethodPointcut:使用JDK中定义的正则表达式对方法名进行匹配的静态Pointcut.范例如下:

1 <bean id="JdkRegexpMethodPointcut"
2 class="org.springframework.aop.support.JdkRegexpMethodPointcut">
3 <property name="patterns">
4 <list>
5 <value>.*ost</value>
6 <value>.*tart</value>
7 </list>
8 </property>
9 <property name="excludedPatterns">
10 <list>
11 <value>.*tart</value>
12 </list>
13 </property>
14 </bean>
15
注意:。*ost正则表达式,所有以ost结尾的方法都匹配。

在该例中,patterns属性是一个java.lang.Sring[]类型的数组,表示数组中所有和定义的正则表达式匹配的方法都包含在定义的切入点内。excludedPatterns则相反,表示被排除于切入点范围的方法。同时和NameMatchMethodPointcut一样,它也可以用ClassFilter类型的classFilter属性来定义类过滤器。

3、 StaticMethodMatcherPointcut:一个抽象的静态Pointcut,它不能被实例化。开发者可以自己扩展该类来实现自定义的切入点。