【问题标题】:Conditional Pointcut expression条件切入点表达式
【发布时间】:2020-10-01 18:25:25
【问题描述】:

我想根据我的数据库中的某些属性启用/禁用某个方面。我该怎么做?

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

@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>

【问题讨论】:

  • 感谢您告诉我们您不想要的东西。你想要什么,你的示例代码在哪里?如果您使用 Aspect,为什么需要将您的切面作为组件?只有 Spring AOP 才需要。但实际上 Spring AOP 和 AspectJ 都支持 if() 切入点指示符。您可以将任何类型的代码放入该方法中。我真的不明白问题出在哪里。
  • 附上我的示例代码。我想根据数据库中的属性运行我的 Aspect。我尝试使用 if() 并且它确实有效,但我使用的是 IntelliJ,它显示错误为“如果指针指示符不受弹簧支持”。

标签: spring-boot intellij-idea aspectj


【解决方案1】:

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

在您的情况下,方面是本机 AspectJ 方面,而不是 Spring AOP 方面。 IDEA 不理解这一点,因此解决您的问题的方法不是改变您的方法,而只是在编辑器中忽略错误消息,因为您对 if() 所做的操作是正确的。

另外,您也可以告诉 IDEA 抑制 Spring AOP 错误检查 为一个方法或整个类:

例如,在您选择“Suppress for class”后,错误将消失,您将在班级顶部看到注释 @SuppressWarnings("SpringAopErrorsInspection")。这应该让你安心一些。但是请注意,这也可能抑制其他适用于 AspectJ 的 Spring AOP 语法错误,因为 Spring AOP 切入点语法基本上是 AspectJ 语法的子集。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2022-08-06
    • 2012-12-31
    相关资源
    最近更新 更多