我有以下建议:
@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
答案 0 :(得分:0)
它记录每个包的每个方法调用
不,它没有。它仅记录包com.myapp
及其所有子包中的每个方法,但com.myapp.cms.workflow
内部和下方的所有内容除外。如果这不是你想要的,也许你应该改变你的切入点。
<强>更新强>
你似乎不相信我,这证明你的陈述是错误的。
根据您的示例的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不是问题。我想这个问题就在电脑前面。