由于以下给出的建议仅适用于特定类别
@Before("staticinitialization(org.mazouz.aop.Main1)")
我尝试使建议变得通用,以便它可以适用于任何包
@Before("staticinitialization(*.*.*(..))")
我收到以下错误
Syntax error on token "staticinitialization(*.*.*(..))", ")" expected
如果您查看 AspectJ 文档和您自己的第一个示例,您会注意到
statitinitialization
采用表示类型名称的切入点模式,而不是任何类型的方法或构造函数调用,这是有意义的,因为您试图拦截静态类初始化,您只有类名可以使用。
您还应该使用更简单的模式而不是
*.*.*
,例如*
(所有课程)或 org.acme.my_app..*
。
最后但并非最不重要的一点是,在使用与切面类本身匹配的全局模式时,您需要排除切面本身。否则你会得到如下错误:
Exception in thread "main" java.lang.ExceptionInInitializerError
at de.scrum_master.app.Application.<clinit>(Application.java:1)
Caused by: org.aspectj.lang.NoAspectBoundException: de.scrum_master.aspect.MyAspect
at de.scrum_master.aspect.MyAspect.aspectOf(MyAspect.aj:1)
at de.scrum_master.aspect.MyAspect.<clinit>(MyAspect.aj:1)
... 1 more
这是一个MCVE:
package de.scrum_master.app;
public class Application {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
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 MyAspect {
@Before("staticinitialization(*) && !within(MyAspect)")
public void beforeAdvice(JoinPoint joinPoint) {
System.out.println(joinPoint);
}
}
控制台日志:
staticinitialization(de.scrum_master.app.Application.<clinit>)
Hello world!