AspectJ切入点&&表现得像||

时间:2018-01-19 11:22:40

标签: java aspectj aspect

我有以下建议:

@Before("execution(* com.myapp..*.*(..)) && !execution(* com.myapp.cms.workflow..*.*(..))")
public void logBefore(JoinPoint joinPoint) {
    log.info("Calling " + joinPoint.getSignature().getName());
}

当我向切入点添加第二个条件时:

&& !execution(* com.myapp.cms.workflow..*.*(..))

它记录每个包中的每个方法调用。

我希望该建议仅在myapp包中应用,但不在工作流包下。谁能告诉我做错了什么?

AspectJ 1.6.8

1 个答案:

答案 0 :(得分:0)

  

它记录每个包的每个方法调用

不,它没有。它仅记录包com.myapp及其所有子包中的每个方法,但com.myapp.cms.workflow内部和下方的所有内容除外。如果这不是你想要的,也许你应该改变你的切入点。

顺便说一句,你为什么要使用2009年过时的AspectJ版本?它只支持长期不支持的Java 6。

<强>更新

你似乎不相信我,这证明你的陈述是错误的。

根据您的示例的Java类:

package com.myapp;

public class Foo {
  public String convert(Integer number) {
    return number.toString();
  }
}
package com.myapp.cms.workflow;

public class Workflow {
  public void doSomething() {}
}
package de.scrum_master.app;

import com.myapp.Foo;
import com.myapp.cms.workflow.Workflow;

public class Application {
  // Should not be logged
  public static void main(String[] args) {
    // Should be logged
    new Foo().convert(11);
    // Should not be logged
    new Workflow().doSomething();
  }
}

根据您的示例看点:

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 LogAspect {
  @Before("execution(* com.myapp..*.*(..)) && !execution(* com.myapp.cms.workflow..*.*(..))")
  public void logBefore(JoinPoint thisJoinPoint) {
      System.out.println(thisJoinPoint);
  }
}

我使用Java 8和AspectJ 1.8.13编译。我甚至在控制台上尝试使用AspectJ 1.6.8和Java 1.6.0_45,结果完全一样。

控制台日志:

execution(String com.myapp.Foo.convert(Integer))

Ergo:一切都按预期工作。要么你没有向我展示你真正的切入点,要么你忘了删除从类路径或其他任何方面记录所有内容的另一个方面。 AspectJ不是问题。我想这个问题就在电脑前面。