带有Springboot的AOP,java.io.PrintStream

时间:2014-11-20 09:03:20

标签: spring aspectj spring-boot spring-aop printstream

构建了一个简单的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正在运行,但是执行而不是调用:

@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.");
        }

    }

1 个答案:

答案 0 :(得分:1)

Spring使用proxies来应用AOP,spring只能代理基于spring的bean。实现PrintStream的类通常不是spring配置的bean。在Spring AOP旁边只支持subset AspectJ语法(如消息所示),它支持(以及其他)execution和特殊bean切入点。

如果您想使用更多功能(即call点切割),则必须使用fullblown AspectJ进行加载或编译时编织。