构建了一个简单的 springboot 应用程序,其中包含一些方面检查架构等。
我尝试捕获对System.out.println()的每次调用,以发出有关使用情况的警告这就是我到目前为止发现的:
System.out.println() 使用 PrintStream,所以我尝试过这个:
@Aspect
@Component
public class CleanCodeAspect {
@Before("call(void java.io.PrintStream.println(String))")
public void beforePrintlnCall() {
System.out.println("About to make call to print Hello World");
}
}
但没有成功。日志说
The pointcutexpression call(void java.io.PrintStream.println(String)) contains unsupported pointcut primitive 'call'
类似的方面正在工作,但使用执行而不是调用:
@Aspect
@Component
public class BooleanServiceMonitor {
@Before("execution(* de.fhb..*Service.*(java.lang.Boolean))")
public void logServiceAccess() {
System.out.println("You used a method with only one boolean parameter. "
+ "Refactor it into 2 methods with True, False at the end.");
}
}
使用代理来应用 AOP,Spring 只能代理基于 Spring 的 bean。类实现PrintStream
通常不是 Spring 配置的 bean。接下来,Spring AOP仅支持AspectJ语法的一个子集(如消息所示),它支持(除其他外)execution
和特殊的bean
切入点。
如果你想使用更多的功能(即call
点切割),你将不得不使用成熟的AspectJ和加载或编译时编织。