1

构建了一个简单的 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.");
        }

    }
4

1 回答 1

1

Spring 使用代理来应用 AOP,spring 只能代理基于 spring 的 bean。类实现PrintStream通常不是弹簧配置的 bean。除此之外,Spring AOP 仅支持AspectJ语法的子集(如消息所示),它支持(以及其他)和特殊的切入点。executionbean

如果您想使用更多功能(即call切入点),您将不得不使用成熟的AspectJ和加载或编译时编织。

于 2014-11-20T13:59:20.250 回答