如何使用Spring AOP记录使用@RequestMapping注释的方法的成本时间?

时间:2018-12-06 12:58:06

标签: java spring aspectj

我想记录所有用@RequestMapping注释的方法的成本时间。但是下面的代码不起作用。

N

@Component @Aspect @Slf4j public class LogAop { @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)") public void req() {} @Before("req()") public void logMethod(JoinPoint jp) { String methodName = jp.getSignature().getName(); } @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)") public Object doAroundController(ProceedingJoinPoint pjp) throws Throwable { long begin = System.currentTimeMillis(); log.info(" method {} begin", pjp.getSignature().getName()); Object o; try { o = pjp.proceed(); } catch (Throwable e) { throw e; } finally { long costTime = System.currentTimeMillis() - begin; log.info(" method {} ended cost time {}ms", pjp.getSignature().getName(), costTime); } return o; } } doAroundController都不起作用。

如果我将上面的代码更改为下面的代码,那将起作用:

logMethods

在applicationContext.xml中,我使用以下代码启用spring aop:

@Pointcut("execution(public * *(..))")
public void publicMethod() {}




@Around("publicMethod()")
public Object doAroundController(ProceedingJoinPoint pjp) throws Throwable {

使用JDK 7,Spring MVC 2.5.6,AspectJ 1.7.2。

1 个答案:

答案 0 :(得分:0)

我有类似的东西,它可以工作(最重要的更改:within而不是annotation)。我现在不确定,但是我想我想实现相同的功能并且不能那样做,所以我在控制器中的每个方法上都添加了外观,因为反正它们都用@RequestMapping进行了注释(或至少应该如此。

@Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
void restController() {}

@Pointcut("execution(public * *(..))")
void publicMethod() {}

@Before("restController() && publicMethod()")
void myMethod(JoinPoint joinPoint) {
    ...
}