慕课网,揭秘Spring AOP,https://www.imooc.com/video/15680
第二章 Spring AOP使用详解
切面表达式
通配符
- *:匹配任意数量的字符
- +:匹配指定类及其子类
- ..:匹配任意数量的子包或参数
运算符
&&、||、!,与、或、非
within表达式:匹配包/类型
import org.aspectj.lang.annotation.Pointcut;
//匹配com.imooc包及子包下所有类的方法
@Pointcut("within(com.imooc..*)")
public void matchPackage(){}
//匹配ProductService类里所有的方法
@Pointcut("within(com.imooc.service.ProductService)")
public void matchType(){}
匹配对象
/**
* public class DemoDao implements IDao{}
*/
//匹配AOP对象的目标对象为指定类型的方法,即DemoDao的aop代理对象的方法
@Pointcut("this(com.imooc.DemoDao)")
public void thisDemo(){}
//匹配实现IDao接口的目标对象(而不是aop代理后的对象)的方法,这里即DemoDao的方法
@Pointcut("target(com.imooc.IDao)")
public void targetDemo(){}
//匹配所有以Service结尾的bean里的方法
@Pointcut("bean(*Service)")
public void beanDemo(){}
匹配参数
//匹配任何以find开头而且只有一个Long参数的方法
@Pointcut("execution(**..find*(Long))")
public void argsDemo1(){}
//匹配只有一个Long参数的方法
@Pointcut("args(Long)")
public void argsDemo2(){}
//匹配任何以find开头而且第一个参数是Long参数的方法
@Pointcut("execution(**..find*(Long,..))")
public void argsDemo2(){}
//匹配第一个参数是Long参数的方法
@Pointcut("args(Long,..)")
public void argsDemo4(){}
匹配注解
//匹配方法标注有AdminOnly的注解的方法
@Pointcut("@annotation(com.imooc.demo.security.AdminOnly)")
public void annoDemo(){}
//匹配标注有Beta的类底下的方法,要求的annotation的RetentionPolicy级别为CLASS
@Pointcut("@within(com.google.common.annotations.Beta)")
public void annoWithDemo(){}
//匹配标注有Repository类底下的方法,要求的annotation的RetentionPolicy级别为RUNTIME
@Pointcut("@target(org.springframework.stereotype.Repository)")
public void annoTargetDemo(){}
//匹配传入的参数类标注有Repository注解的方法
@Pointcut("@args(org.springframework.stereotype.Repository")
public void annoArgsDemo(){}
execution表达式