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



我有以下建议:

@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 包中而不是在工作流包下时才适用。谁能告诉我做错了什么?

方面J 1.6.8

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

不,它没有。它仅记录包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))

尔格:一切都按预期工作。要么你没有向我展示你真正的切入点,要么你忘记删除另一个方面,记录类路径中的所有内容或其他内容。AspectJ不是问题。我认为问题出在电脑前面。

最新更新