ITEEDU

Pointcut  交集、联集操作

如 果您建立了多个 Pointcuts,并且在这中间,您发现到有几个 Pointcuts 的定义可以组合在 一起,成为另一个 Pointcuts 的定义,在 Spring 中您可以直接对现在的 Pointcuts 物件,进行 交集或(Intersection)、联集(Union)的操作, org.springframework.aop.support.ComposablePointcut 是 Pointcut 的实作类别,可以操作它 的 intersection()、union()方法来完成这个操作:

ComposablePointcut intersection(ClassFilter filter); 
ComposablePointcut intersection(MethodMatcher mm) 
ComposablePointcut intersection(Pointcut other) 
ComposablePointcut union(ClassFilter filter) 
ComposablePointcut union(MethodMatcher mm)

例如:

Pointcut pc = new ComposablePointcut()
									.union(classFilter)
									.intersection(methodMatcher)
									.intersection(pointcut);

在 ComposablePointcut 中没有方法可以处理两个 Pointcut 的联集,您要使用 org.springframework.aop.support.Pointcuts 的 union()方法,例如:

 Pointcut union = Pointcuts.union(pointcut1, pointcut2); 

当然的,这是必须在程式中直接撰写才可以进行交集或联集操作,如果您想要可以在 Bean 定义 档中直接宣告,则您可以设计一个类别,然后于 Bean 定义档中宣告,这可以增加 Pointcut 操作 后的重用性,例如:

package onlyfun.caterpillar;

import java.util.List;
import org.springframework.aop.ClassFilter; 
import org.springframework.aop.MethodMatcher; 
import org.springframework.aop.Pointcut; 
import org.springframework.aop.framework.AopConfigException;
import org.springframework.aop.support.Pointcuts;

public class UnionPoint implements Pointcut {
	private Pointcut pointcut;
	public ClassFilter getClassFilter() {
		return getPointcut().getClassFilter();
	}
	public MethodMatcher getMethodMatcher() {
		return getPointcut().getMethodMatcher();
	}
	public void setPointcuts(List pointcuts) {
		if(pointcuts == null || pointcuts.size == 0) {
			throw new AopConfigException( "至少要设定一个 Pointcut");
		}
		pointcut = (Pointcut) pointcuts.get(0);
		for(int i = 0; i < pointcuts.size(); i++) {
			Pointcut next = (Pointcut) pointcuts.get(i);
			pointcut = Pointcuts.union(pointcut, next);
		}
	}
	private Pointcut getPointcut() {
		if(pointcut == null) {
			throw new AopConfigExeption("没有设定 Pointcut");
		}
		return pointcut;
	}
}