【问题标题】:Pointcut matching an annotation's parameter value切入点匹配注解的参数值
【发布时间】:2020-07-24 15:55:48
【问题描述】:

假设我有如下注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBOperation
{
    boolean isReadOperation() default true;
}

那么在Aspect中,我怎么可能想写两个切入点,一个用于所有用@DBOperation(isReadOperation=true)注释的方法,一个用于@DBOperation(isReadOperation=false)?

【问题讨论】:

    标签: annotations aop aspectj pointcut


    【解决方案1】:

    语法实际上非常简单。这是MCVE

    标记注释:

    package de.scrum_master.app;
    
    import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    @Retention(RUNTIME)
    @Target(METHOD)
    public @interface DBOperation {
      boolean isReadOperation() default true;
    }
    

    驱动程序应用:

    package de.scrum_master.app;
    
    public class Application {
      public static void main(String[] args) {
        Application application = new Application();
        application.doSomething();
        application.readValue("name");
        application.writeValue("name", "John Doe");
      }
    
      public void doSomething() {}
    
      @DBOperation
      public int readValue(String fieldName) {
        return 11;
      }
    
      @DBOperation(isReadOperation = false)
      public String writeValue(String fieldName, Object value) {
        return "dummy";
      }
    }
    

    方面:

    package de.scrum_master.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class DBOperationAspect {
      @Before("execution(@de.scrum_master.app.DBOperation(isReadOperation=true) * *(..))")
      public void interceptRead(JoinPoint joinPoint) throws Throwable {
        System.out.println("Read operation: " + joinPoint);
      }
    
      @Before("execution(@de.scrum_master.app.DBOperation(isReadOperation=false) * *(..))")
      public void interceptWrite(JoinPoint joinPoint) throws Throwable {
        System.out.println("Write operation: " + joinPoint);
      }
    }
    

    控制台日志:

    Read operation: execution(int de.scrum_master.app.Application.readValue(String))
    Write operation: execution(String de.scrum_master.app.Application.writeValue(String, Object))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多