自定义切面基于注解@Aspect及语法详解
前言
AOP 把软件的功能模块分为两个部分:核心关注点和横切关注点。业务处理的主要功能为核心关注点,而非核心、需要拓展的功能为横切关注点。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点进行分离。
横切关注点(比如事务管理、权限控制、缓存控制、日志打印等)
语法详解
@Aspect: 表明当前类是一个切面类
@Pointcut
切面可捕获的连接点种类
名称 | 描述 |
---|---|
方法执行 | execution(MethodSignature) |
方法调用 | call(MethodSignature) |
构造器执行 | execution(ConstructorSignature) |
构造器调用 | call(ConstructorSignature) |
类初始化 | staticinitialization(TypeSignature) |
属性读操作 | get(FieldSignature) |
属性写操作 | set(FieldSignature) |
例外处理执行 | handler(TypeSignature) |
对象初始化 | initialization(ConstructorSignature) |
对象预先初始化 | preinitialization(ConstructorSignature) |
切入点表达式中使用的切入点指示符有
切入点指示符
名称 | 描述 |
---|---|
execution | 用于匹配方法执行的连接点; |
within | 用于匹配指定类型内的方法执行; |
this | 用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配; |
target | 用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配; |
args | 用于匹配当前执行的方法传入的参数为指定类型的执行方法; |
@within | 用于匹配所以持有指定注解类型内的方法; |
@target | 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解; |
@args | 用于匹配当前执行的方法传入的参数持有指定注解的执行; |
@annotation | 用于匹配当前执行方法持有指定注解的方法; |
bean | Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法; |
reference pointcut | 表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。 |
AspectJ类型匹配的通配符
通配符 | 描述 | 示例 |
---|---|---|
* | 匹配任何数量字符; | 1、java.*.String 匹配java.lang.String,但不匹配java.lang.ss.String; 2、java.lang.*ing 匹配任何java.lang包下的以ing结尾的类型 |
.. | 匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。 | java..* 匹配java包及任何子包下的任何类型; |
+ | 匹配指定类型的子类型;仅能作为后缀放在类型模式后边。 | java.lang.Number+ 匹配java.lang包下的任何Number的自类型;如匹配java.lang.Integer,也匹配java.math.BigInteger |
@within和@target针对类的注解,@annotation是针对方法的注解
示例
示例 | 描述 |
---|---|
execution(public * *(..)) | 任意公共方法的执行 |
execution(* set*(..)) | 任何一个以“set”开始的方法的执行 |
execution(* com.AccountService.*(..)) | AccountService 接口的任意方法的执行 |
execution(* com.xyz.servic.*.*(..)) | 定义在service包里的任意方法的执行 |
execution(* com.xyz.service..*.*(..)) | 定义在service包和所有子包里的任意类的任意方法的执行 |
execution(* com.pointcutexp..JoinPointObjP2.*(..))") | 定义在pointcutexp包且所有子包里的JoinPointObjP2类的任意方法的执行 |
within(com.test.spring.aop.pointcutexp.*) | pointcutexp包里的任意类 |
within(com.test.spring.aop.pointcutexp..*) | pointcutexp包和所有子包里的任意类 |
this(com.test.spring.aop.pointcutexp.Intf) | 实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类 | </