对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

Spring 中的 Pointcut API

本节描述了Spring如何处理关键点切概念。spring-doc.cadn.net.cn

概念

Spring的点切题模型支持点切入的重复使用,独立于建议类型。您可以 针对不同的建议,但同样的切入点。spring-doc.cadn.net.cn

org.springframework.aop.Pointcut接口是中央接口,用于 针对特定课程和方法的目标建议。完整界面如下:spring-doc.cadn.net.cn

public interface Pointcut {

	ClassFilter getClassFilter();

	MethodMatcher getMethodMatcher();
}

分割点切分成两部分的接口允许重复使用类和方法 匹配部件和细粒度合成作(例如执行“并集” 并配有另一个方法匹配器)。spring-doc.cadn.net.cn

类过滤器接口用于限制点割对应的目标集合 类。如果比赛()方法总是返回真,所有目标类均为 匹配。以下列表显示了类过滤器界面定义:spring-doc.cadn.net.cn

public interface ClassFilter {

	boolean matches(Class clazz);
}

方法匹配器接口通常更重要。完整界面如下:spring-doc.cadn.net.cn

public interface MethodMatcher {

	boolean matches(Method m, Class<?> targetClass);

	boolean isRuntime();

	boolean matches(Method m, Class<?> targetClass, Object... args);
}

匹配(方法,类别)用于测试该点割是否曾经 匹配目标类上的给定方法。此评估可在AOP期间进行 代理的创建是为了避免每次方法调用都进行测试。如果 二元论元比赛方法返回true对于给定方法,以及isRuntime()方法匹配器返回true,三参数匹配方法为 每次方法调用都会被调用。这使得点数切割可以查看已通过的论点 在目标建议开始前立即调用方法。spring-doc.cadn.net.cn

方法匹配器实现是静态的,意味着他们的isRuntime()方法 返回false.在这种情况下,三元论证比赛方法从未被调用。spring-doc.cadn.net.cn

如果可能,尽量让点切是静态的,这样AOP框架就能缓存 创建AOP代理时的点割评估结果。

点切作

Spring支持点切口的作(尤其是合集和交叉)。spring-doc.cadn.net.cn

并指任一点切入所匹配的方法。 交点指的是两个点割方法匹配的方法。 联合通常更有用。 你可以用静态方法来组合点割org.springframework.aop.support.Pointcuts类或通过使用可组合点切割同一个包裹里的课程。然而,使用 AspectJ 点切割 表达式通常是一种更简单的方法。spring-doc.cadn.net.cn

AspectJ表达式点切

自2.0版本起,Spring 使用的最重要的点切类型是org.springframework.aop.aspectj.AspectJExpressionPointcut.这是一个点切 使用AspectJ提供的库来解析AspectJ的点切割表达式字符串。spring-doc.cadn.net.cn

关于支持的 AspectJ 点切割原语的讨论,请参见上一章spring-doc.cadn.net.cn

便利点切割实现

Spring 提供了几种方便的点切割实现。你可以用其中一些 径直;其他则旨在通过应用特定的点切割进行子类化。spring-doc.cadn.net.cn

静态点切

静态点割基于方法和目标类,无法考虑 方法论证。静态点切对于大多数用途来说是最好的。 Spring 只能在方法首次调用时评估静态点切割一次。 之后,每次调用方法时就无需重新评估点切割。spring-doc.cadn.net.cn

本节其余部分将介绍一些静态点切割实现,包括 随《春季》一起。spring-doc.cadn.net.cn

正则表达式点割

一种显而易见的指定静态点割方法是正则表达式。多个AOP 除了Spring之外,还有其他框架可以实现这一点。org.springframework.aop.support.JdkRegexpMethodPointcut是一般正则 表达式点切割,使用JDK中正则表达式的支持。spring-doc.cadn.net.cn

JdkRegexpMethodPointcut你可以提供一份模式字符串列表。 如果这些中的任何一个匹配,点割算值为true.(因此, 由此产生的点割实际上是指定图案的并集。)spring-doc.cadn.net.cn

以下示例展示了如何使用JdkRegexpMethodPointcut:spring-doc.cadn.net.cn

<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和建议,如下例子所示:spring-doc.cadn.net.cn

<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对任意建议类型。spring-doc.cadn.net.cn

属性驱动的点切割

一种重要的静态点切割类型是元数据驱动的节点切换。这使用了 元数据属性的值(通常是源级元数据)。spring-doc.cadn.net.cn

动态点切

动态点割法的评估成本高于静态点割。他们会考虑因素 方法参数以及静态信息。这意味着它们必须是 每次调用方法时都评估结果,且结果不能像参数那样被缓存 不同。spring-doc.cadn.net.cn

主要的例子是控制流Pointcut。spring-doc.cadn.net.cn

控制流点切口

Spring控制流点切口在概念上与AspectJ相似克洛夫Pointcuts, 虽然力量较弱。(目前无法指定点割是否运行 下方是一个连接点,另一个切口与之匹配。)控制流点割与 当前通话堆栈。例如,如果连接点被某个方法调用,它可能会触发 在com.mycompany.web包裹或通过来电者类。控制流点切口 通过以下方式表示org.springframework.aop.support.ControlFlowPointcut类。spring-doc.cadn.net.cn

控制流点切割在运行时评估成本远高于运行时 其他动态点切。在 Java 1.4 中,成本大约是其他动态算法的五倍 点切。

Pointcut超级车

Spring 提供了有用的 pointcut 超类,帮助你实现自己的 pointcut。spring-doc.cadn.net.cn

因为静态点切最有用,你可能应该选择子职业StaticMethodMatcherPointcut.这只需要实现一个 抽象方法(虽然你可以覆盖其他方法来自定义行为)。这 以下示例展示了如何子类StaticMethodMatcherPointcut:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

自定义点切

因为 Spring AOP 中的切入点是 Java 类,而不是语言特性(如 AspectJ),你可以声明自定义的点割,无论是静态还是动态。习惯 春季的点切可能非常复杂。不过,我们建议使用 AspectJ 点切割 如果可以的话,表达语言。spring-doc.cadn.net.cn

Spring的后续版本可能会支持JAC提供的“语义点切割”——例如,“所有改变目标对象实例变量的方法”。