# 4.2　通过切点来选择连接点

正如之前所提过的，切点用于准确定位应该在什么地方应用切面的通知。通知和切点是切面的最基本元素。因此，了解如何编写切点非常重要。

在 Spring AOP 中，要使用 AspectJ 的切点表达式语言来定义切点。如果你已经很熟悉 AspectJ，那么在 Spring 中定义切点就感觉非常自然。但是如果你一点都不了解 AspectJ 的话，本小节我们将快速介绍一下如何编写 AspectJ 风格的切点。如果你想进一步了解 AspectJ 和 AspectJ 切点表达式语言，我强烈推荐 Ramniva Laddad 编写的《AspectJ in Action》第二版。

关于 Spring AOP 的 AspectJ 切点，最重要的一点就是 Spring 仅支持 AspectJ 切点指示器（pointcut designator）的一个子集。让我们回顾下，Spring 是基于代理的，而某些切点表达式是与基于代理的 AOP 无关的。表 4.1 列出了 Spring AOP 所支持的 AspectJ 切点指示器。

| AspectJ 指示器 | 描 述                                                  |
| ----------- | ---------------------------------------------------- |
| arg()       | 限制连接点匹配参数为指定类型的执行方法                                  |
| @args()     | 限制连接点匹配参数由指定注解标注的执行方法                                |
| execution() | 用于匹配是连接点的执行方法                                        |
| this()      | 限制连接点匹配AOP代理的bean引用为指定类型的类                           |
| target      | 限制连接点匹配目标对象为指定类型的类                                   |
| @target()   | 限制连接点匹配特定的执行对象，这些对象对应的类要具有指定类 型的注解                   |
| within()    | 限制连接点匹配指定的类型                                         |
| @within()   | 限制连接点匹配指定注解所标注的类型（当使用Spring AOP时，方 法定义在由指定的注解所标注的类里） |
| @annotation | 限定匹配带有指定注解的连接点                                       |

在 Spring 中尝试使用 AspectJ 其他指示器时，将会抛出 IllegalArgumentException 异常。

当我们查看如上所展示的这些 Spring 支持的指示器时，注意只有 execution 指示器是实际执行匹配的，而其他的指示器都是用来限制匹配的。这说明 execution 指示器是我们在编写切点定义时最主要使用的指示器。在此基础上，我们使用其他指示器来限制所匹配的切点。
