它记录来自每个包的每个方法调用
不,它没有。它仅记录包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 不是问题。我想问题出在电脑前面。