我想记录所有用@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。
答案 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) {
...
}