条件切入点表达式

Conditional Pointcut expression

我想 enable/disable 基于我数据库中的一些 属性 的方面。我该怎么做?

我也在使用 AspectJ LTW,但是当我尝试在 @Pointcut 中使用 if() 时,它显示警告但代码编译正常。我不想走那条路。另外,我不想让我的方面成为一个组件并使用条件 属性,因为那样我就必须从 属性 文件中选择 属性。 这是我的代码的粗略片段。

@Aspect
class A {
  boolean flag = //get value from DB; 
    
  @Pointcut(value = "execution(* com.sample..check(..)) && if())
  public boolean conditional() {
    return flag==true ? true : false;
  }
    
  @Before("conditional()")
  public void doSomething() {
    System.out.println("Hello");
  }
}

aop.xml

<aspectj>
  <aspects>
    <aspect name = "com.sample.aspect.A"/>
    <weaver>
      <include within = "com.sample..*"/>
    </weaver>
  </aspects>
</aspectj>

IntelliJ IDEA 中的错误消息 if pointcut designator isn't supported by Spring 告诉您 Spring AOP 方面的真相。如果您在 Spring 项目中使用某个方面,它会自动启动。

在您的情况下,方面是原生 AspectJ 方面,而不是 Spring AOP 方面。 IDEA 不明白这一点,所以你的问题的解决方案不是改变你的方法,而是 忽略编辑器中的错误消息 因为你正在用 if() 做的是正确。

或者,您也可以告诉 IDEA 抑制 Spring AOP 错误检查 一个方法或整个 class:

例如,在您 select“抑制 class”之后,错误会消失,您会在 class 上方看到注释 @SuppressWarnings("SpringAopErrorsInspection") .这应该会让你安心。但是请注意,这也可能会抑制其他适用于 AspectJ 的 Spring AOP 语法错误,因为 Spring AOP 切入点语法基本上是 AspectJ 语法的一个子集。