目标否定不适用于Spring AOP

时间:2015-10-14 22:15:51

标签: spring spring-boot spring-aop

我们使用spring boot并通过实现MVCEndpoint实现了额外的Actuator端点。我们还将AOP应用于@RequestMapping方法以监控响应时间。

我有这两个班级:

include

public class ControllerStub {
    @RequestMapping("/controller")
    public String method(String arg) {
        return "ok";
    }
}

以下方面:

 public class MyMvcEndpoint implements MvcEndpoint, Endpoint {
    @Override
    public String getPath() {
        return "path";
    }

    @Override
    public boolean isSensitive() {
        return true;
    }

    @Override
    public Class<? extends org.springframework.boot.actuate.endpoint.Endpoint> getEndpointType() {
        return null;
    }

    @RequestMapping("/mvcEndpoint")
    public String method(){
        return "ok";
    }
}

除了MvcEndpoint中的所有@RequestMapping方法之外,它还包含所有@RequestMapping方法,并且它没有像我期望的那样工作。它确实过滤掉了MVCEndpoint。但它并没有将ControllerStub包装在代理中。

我开始调试,我能够将其追溯到RuntimeTestWalker和ShadowMatch。看起来这个否定确实是使用aspectJ合成的,而不是包含aspectJ InstanceOf表达式。在ShadowMatch中,residualTest是

@Around("@annotation(requestMapping) && !target(org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint)")
    public Object process(ProceedingJoinPoint joinPoint, RequestMapping requestMapping) throws Throwable {
        return timeExecution(joinPoint);
    }

但是,我不知道否定的适用范围。在我看来,当instanceof检查失败而没有被否定时,结果返回false。

我在TestVisitorAdapter上访问了访问Not表达式的方法:

!((Var org.waterford.core.webapp.integrationtests.ControllerStub) instanceof org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint)

我不了解所有的AspectJ机制,但我希望在RuntimeTestWalker.visit(Not e)的实现中,它必须在测试正文后否定结果。我的身体就是检查的实例。

我使用的是spring-boot 1.2.5.RELEASE和AspectJ Weaver 1.8.7。看起来像RuntimeTestWalker来自spring-aop-4.2.1.RELEASE对我来说。

0 个答案:

没有答案