|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
Spring 中的 Pointcut API
本节描述了Spring如何处理关键点切概念。
概念
Spring的点切题模型支持点切入的重复使用,独立于建议类型。您可以 针对不同的建议,但同样的切入点。
这org.springframework.aop.Pointcut接口是中央接口,用于
针对特定课程和方法的目标建议。完整界面如下:
public interface Pointcut {
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
分割点切分成两部分的接口允许重复使用类和方法
匹配部件和细粒度合成作(例如执行“并集”
并配有另一个方法匹配器)。
这类过滤器接口用于限制点割对应的目标集合
类。如果比赛()方法总是返回真,所有目标类均为
匹配。以下列表显示了类过滤器界面定义:
public interface ClassFilter {
boolean matches(Class clazz);
}
这方法匹配器接口通常更重要。完整界面如下:
public interface MethodMatcher {
boolean matches(Method m, Class<?> targetClass);
boolean isRuntime();
boolean matches(Method m, Class<?> targetClass, Object... args);
}
这匹配(方法,类别)用于测试该点割是否曾经
匹配目标类上的给定方法。此评估可在AOP期间进行
代理的创建是为了避免每次方法调用都进行测试。如果
二元论元比赛方法返回true对于给定方法,以及isRuntime()方法匹配器返回true,三参数匹配方法为
每次方法调用都会被调用。这使得点数切割可以查看已通过的论点
在目标建议开始前立即调用方法。
最方法匹配器实现是静态的,意味着他们的isRuntime()方法
返回false.在这种情况下,三元论证比赛方法从未被调用。
| 如果可能,尽量让点切是静态的,这样AOP框架就能缓存 创建AOP代理时的点割评估结果。 |
点切作
Spring支持点切口的作(尤其是合集和交叉)。
并指任一点切入所匹配的方法。
交点指的是两个点割方法匹配的方法。
联合通常更有用。
你可以用静态方法来组合点割org.springframework.aop.support.Pointcuts类或通过使用可组合点切割同一个包裹里的课程。然而,使用 AspectJ 点切割
表达式通常是一种更简单的方法。
AspectJ表达式点切
自2.0版本起,Spring 使用的最重要的点切类型是org.springframework.aop.aspectj.AspectJExpressionPointcut.这是一个点切
使用AspectJ提供的库来解析AspectJ的点切割表达式字符串。
关于支持的 AspectJ 点切割原语的讨论,请参见上一章。
便利点切割实现
Spring 提供了几种方便的点切割实现。你可以用其中一些 径直;其他则旨在通过应用特定的点切割进行子类化。
静态点切
静态点割基于方法和目标类,无法考虑 方法论证。静态点切对于大多数用途来说是最好的。 Spring 只能在方法首次调用时评估静态点切割一次。 之后,每次调用方法时就无需重新评估点切割。
本节其余部分将介绍一些静态点切割实现,包括 随《春季》一起。
正则表达式点割
一种显而易见的指定静态点割方法是正则表达式。多个AOP
除了Spring之外,还有其他框架可以实现这一点。org.springframework.aop.support.JdkRegexpMethodPointcut是一般正则
表达式点切割,使用JDK中正则表达式的支持。
与JdkRegexpMethodPointcut你可以提供一份模式字符串列表。
如果这些中的任何一个匹配,点割算值为true.(因此,
由此产生的点割实际上是指定图案的并集。)
以下示例展示了如何使用JdkRegexpMethodPointcut:
<bean id="settersAndAbsquatulatePointcut"
class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>.*set.*</value>
<value>.*absquatulate</value>
</list>
</property>
</bean>
Spring提供了一个方便类别,名为RegexpMethodPointcutAdvisor,这使得我们能够
另见建议(记住建议可以作为拦截机,在获得建议之前,
投掷建议,以及其他内容)。在幕后,Spring 使用JdkRegexpMethodPointcut.
用RegexpMethodPointcutAdvisor这样可以简化接线,因为一颗豆子同时封装了两者
Pointcut和建议,如下例子所示:
<bean id="settersAndAbsquatulateAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="beanNameOfAopAllianceInterceptor"/>
</property>
<property name="patterns">
<list>
<value>.*set.*</value>
<value>.*absquatulate</value>
</list>
</property>
</bean>
你可以使用RegexpMethodPointcutAdvisor对任意建议类型。
Pointcut超级车
Spring 提供了有用的 pointcut 超类,帮助你实现自己的 pointcut。
因为静态点切最有用,你可能应该选择子职业StaticMethodMatcherPointcut.这只需要实现一个
抽象方法(虽然你可以覆盖其他方法来自定义行为)。这
以下示例展示了如何子类StaticMethodMatcherPointcut:
-
Java
-
Kotlin
class TestStaticPointcut extends StaticMethodMatcherPointcut {
public boolean matches(Method m, Class targetClass) {
// return true if custom criteria match
}
}
class TestStaticPointcut : StaticMethodMatcherPointcut() {
override fun matches(method: Method, targetClass: Class<*>): Boolean {
// return true if custom criteria match
}
}
还有用于动态点切的超类。 你可以用自定义的点切来处理任何建议类型。
自定义点切
因为 Spring AOP 中的切入点是 Java 类,而不是语言特性(如 AspectJ),你可以声明自定义的点割,无论是静态还是动态。习惯 春季的点切可能非常复杂。不过,我们建议使用 AspectJ 点切割 如果可以的话,表达语言。
| Spring的后续版本可能会支持JAC提供的“语义点切割”——例如,“所有改变目标对象实例变量的方法”。 |