Spring的Pointcut分为静态Pointcut
动态Pointcut和用户自定义Pointcut三种
其中静态Pointcut只是需要考虑类名
方法名
动态Pointcut除此之外
还要考虑方法的参数
以便在运行时可以动态的确定切入点的位置
Spring中切入点的粒度是方法级因此在Spring AOP中Pointcut的作用是配置哪些类中哪些方法在我们定义的且入点之内哪些方法应该被过滤排除
静态Pointcut
静态即意味着不变例如方法和类的名称因此我们可以根据类和方法的签名来判定那些类的哪些方法在我们定义的切入点之内哪些应该被过滤排除
Spring中定义中如下几个静态Pointcut的实现类介绍如下
NameMatchMethodPointcut:只能对方法名进行判别的静态Pointcut实现类
代码示例
<bean id=NameMatchMethodPointcut class=orgspringframeworkaopsupportNameMatchMethodPointcut>
<property name=mappedNames>
<list>
<value>pos*</value>
<value>start</value>
</list>
</property>
</bean>
注意post*表示包含所有以pos开始的方法
此外NameMatchMethodPointcut还暴露了ClassFilter类型的classFilter属性可以用于指定ClassFilter接口的实现类来设置类过滤器ClassFilter接口的定义如下
代码示例
package orgspringframeworkaop;
public interface ClassFilter {
boolean matches(Class clazz)
ClassFilter TRUE = TrueClassFilterINSTANCE;
}
package orgspringframeworkaop;
其中matches方法用于类的匹配参数clazz是需要匹配的目标类匹配成功则返回true
使用JDK中定义的正则表达式对方法名进行匹配的静态PointcutJdkRegexpMethodPointcut
代码示例
<bean id=JdkRegexpMethodPointcut class=orgspringframeworkaopsupportJdkRegexpMethodPointcut>
<property name=patterns>
<list>
<value>*ost</value>
<value>*tart</value>
</list>
</property>
<property name=excludedPatterns>
<list>
<value>*tart</value>
</list>
</property>
</bean>
注意*ost正则表达式所有以ost结尾的方法都匹配
抽象的静态PointcutStaticMethodMatcherPointcut它不能被实例化开发者可以自己扩展该类来实现自定义的切入点