方法切点函数
函数 | 入参 | 说明 | 示例 |
---|---|---|---|
execution() | 方法匹配字符串 | 满足某一匹配模式的的所有目标类方法连接点 | execution(* com.yc.service.*.*(..)) 在配置service层的事务管理时常用,定位于任意返回类型(第一个”*”) 在com.yc.service包下的所有类(第二个”*”)下的所有方法(第三个”*”),且这个方法的入参为任意类型、数量(体现在 “(..)“) |
@annotation() | 方法注解类名 | 标注了特定注解的目标方法连接点上 |
|
方法入参切点函数
函数 | 入参 | 说明 | 示例 |
---|---|---|---|
args() | 类名 | 定位于入参为特定类型的的方法 | 如args(com.yc.model.User,com.yc.model.Article),我们要定位于所有以User,Article为入参的方法,需要注意的是,类型的个数、顺序必须都一一对应) |
@args() | 类型注解类名 | 定位于被特定注解的类作为方法入参的连接点 | @args(com.yc.annotation.MyAnnotation)。MyAnnotation为自定义注解,标注在目标对象方法入参上,被标注的目标都会被匹配。,如方法public myMethod(@MyAnnotation String args); |
目标类切点函数
函数 | 入参 | 说明 | 示例 |
---|---|---|---|
within() | 类名匹配串 | 定位于特定作用于下的所有连接点 | within(com.yc.service.*ServiceImpl),可以通过此注解为特定包下的所有以ServiceImpl名字结尾的类里面的所有方法添加事务控制。 |
target() | 类名 | 定位于指定类及其子类 | target(com.yc.service.IUserService),则可定位到IUserService接口和它的实现类如UserServiceImpl |
@within() | 类型注解类名 | 定位与标注了特定注解的类及其实现类 | @within(com.yc.controller.needRecord),比如我们可以在BaseController中标注@needRecord,则所有继承了BaseController的UserController、ArticleController等等都会被定位 |
@target() | 类型注解类名 | 定位于标注了特定注解的目标类里所有方法 | @target(com.yc.controller.needRecord),则可以在controller层中,为我们需要日志记录的类标注@needRecord。 |
以上Spring支持的AspectJ指示器,只有execution指示器是实际执行匹配的,而其他指示器都是用来限制匹配的.
编写切点:
package main.java;
/**
* @author myvina@qq.com
* @date 18-4-18 上午8:38
*/
public interface Performance {
void perform();
}
Performance接口可以代表任何类型的表演,可以作为一个切点.
下面将展现一个切点表达式,这个表达式能够设置当perform()方法执行时触发通知的调用.
execution(* main.java.Performance.perform(..))
execution表示在方法执行时触发
* 表示返回任意类型
main.java.Performance表示方法所属的类
perform表示所属类的方法
(..)可表示任意被重载的该方法(即使用任意参数)
还可用下述的表达式表示需要匹配的切点仅匹配main.java包里的方法.
execution(* main.java.Performance.perform(..)) && within(main.java.*)
除了&&,还有||和!,同C语言.
(因为&在XML中有特殊含义,所以在Spring的XML配置里面描述切点时,它们将用and,or,not代替,同Python)
在切点中选择Bean:
Spring还引入了一个bean()指示器,它允许在切点表达式中使用bean的ID来表示bean
execution(* main.java.Performance.perform(..)) and bean(main.java.Vina)