Spring AOP简单讲解

一、匹配表达式

1.1 Wildcards(通配符)

  • * 匹配任意数量的字符
  • + 匹配指定类及其子类
  • .. 一般用于匹配任意数的子包或参数

1.2 Operators(运算符)

  • && 与操作符
  • || 或操作符
  • !非操作符

1.3 Designators(指示器)

  • 匹配方法:execution()  最常见
  • 匹配注解:@target()、@args()、@within()、@annotation()
  • 匹配包/类型:within()
  • 匹配对象:this()、bean()、target()
  • 匹配参数:args()

二、匹配类型详解

2.1 匹配包/类型

//匹配GoodsService类里的方法
@Pointcut("within(heu.jshop.Service.GoodsService)")
    public void matchType() {
}

//匹配java.jshop.Service包及子包下所有类的方法
@Pointcut("within(heu.jshop.Service..*)")
    public void matchPackage() {
}

@Before("matchType()")
public void before(){
    System.out.println("before");
}

2.2 匹配对象

/**
 * 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(){
}

2.3 参数匹配

//匹配任何以find开头且只有一个Long参数的方法
@Pointcut("execution(* *..find*(Long))")
    public void argsDemo1() {
}

//匹配任何只有一个Long参数的方法
@Pointcut("args(Long)")
    public void argsDemo2() {
}

//匹配任何以find开头且第一个参数为Long的方法
@Pointcut("execution(* *..find*(Long,..))")
    public void argsDemo3(){
}

//匹配第一个参数为Long的方法
@Pointcut("args(Long,..)")
    public void argsDemo4{
}

2.4 匹配注解

//匹配方法标注有AdminOnly注解的方法
@Pointcut("@annotation(com.imooc.demo.security.AdminOnly)")
    public void annoDemo() {
}

//匹配标注有Beta的类底下的方法,要求annotation的RetentionPolicy级别为Class
@Pointcut("@within(com.google.common.annotations.Beta)")
    public void argsDemo2() {
}

//匹配标注有Repository的类地下的方法,要求的annotation的RetentionPolicy级别为RUNTIME
@Pointcut("@target(org.springframework.stereotype.Repository)")
    public void argsDemo3(){
}

//匹配传入的参数类标注有Repository注解的方法
@Pointcut("@args(org.springframework.stereotype.Reository)")
    public void argsDemo4{
}

2.5 匹配方法

 @Pointcut("execution(public * com.imooc.service.*Service.*(..))")
 public void matchCondition(){
 }

 @Before("matchCondition()")
     public void before(){
 }

execution(public * com.imooc.service.*Service.*(..))

第一个*:代表返回值,写成Void就代表拦截返回值为Void的

三、Advice五种注解

  • @Before:前置通知
  • @After(finally):后置通知,方法执行完后
  • @AfterReturning:返回通知,成功执行之后
  • @AfterThrowing:异常通知,抛出异常之后
  • @Around:环绕通知