# 6.1.切点API

## 概念

Spring的切点模型使得切点可以复用advice类的依赖。你能够使用相同的切点指向不同的advice

`org.springframework.aop.Pointcut` 接口是用于将advices指向特定类或方法的核心接口，其完整实现如下：

```java
public interface Pointcut {

    ClassFilter getClassFilter();

    MethodMatcher getMethodMatcher();

}
```

将`Pointcut`接口分为两部分，可以重用类和方法匹配的部分以及细粒度的合成操作（例如与另一个方法匹配器执行“联合”）。

`ClassFilter`接口用于筛选一组给定的目标类。如果matches（）方法始终返回true，则将匹配所有目标类。以下清单显示了ClassFilter接口定义：

```java
public interface ClassFilter {

    boolean matches(Class clazz);
}
```

通常而言，`MethodMatcher`接口相对更重要。完整的接口如下：

```java
public interface MethodMatcher {

    boolean matches(Method m, Class targetClass);

    boolean isRuntime();

    boolean matches(Method m, Class targetClass, Object[] args);
}
```

`matches(Method, Class)` 方法被用于测试切点是否与目标类中给定的方法相匹配。该动作在创建AOP代理时即被执行，从而避免对每个方法调用进行测试。对于一个给定的方法，如果`matches(Method, Class)`方法返回true，并且`isRuntime（）`方法返回true，则将调用`matches(Method, Class, Object[])`方法。这使切入点可以在目标建议开始之前立即查看传递给方法调用的参数。

大多数`MethodMatcher`实现都是静态的，这意味着它们的isRuntime（）方法返回false。在这种情况下，永远不会调用三参数的`matches`方法。

> 由于在创建AOP代理时允许AOP框架缓存切入点评估的结果，如果可能，请尽可能使用静态切入点。

## 切点操作

Spring支持的对切点操作（notably, union 和 intersection）

union 表示方法至少匹配两个切点中的一个。

intersection表示方法两个切点都匹配。

union 通常更有用。您可以通过使用`org.springframework.aop.support.Pointcuts`类中的静态方法或使用同一包中的`ComposablePointcut`类来构成组合切点。不过，使用AspectJ切点表达式通常更简单。

## AspectJ切点表达式
