在接口开发中,我们通常需要统计接口耗时,为后续接口性能做统计。在springMVC中可以用它的aop来记录日志。
1、在spring配置文件中开启AOP
<!--*************** 支持aop **************** --> <aop:aspectj-autoproxy proxy-target-class="true" />
2、编写AOP
package com.parry.demo.aop; import org.apache.log4j.Logger; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** * <p> * PerformanceInterceptor 性能统计接口:接口耗时统计 * <p>*/ @Aspect @Component public class PerformanceInterceptor { private Logger log = Logger.getLogger(PerformanceInterceptor.class); //我需要监控所有controlller的耗时(controller放在包com.parry.demo.controller下面) @Around("execution(* com.parry.demo.controller.*.*(..))") public Object logTome(ProceedingJoinPoint pjp) throws Throwable { long begin = System.currentTimeMillis(); String method = pjp.getSignature().getName(); String className = pjp.getTarget().getClass().getName(); Object ret = pjp.proceed(); log.info("func<doAround> method<" + className + "." + method + "> cost time <" + (System.currentTimeMillis() - begin) + ">ms"); return ret; } }
3、测试访问接口
4、关于AOP的一些说明
(1)一些常见的切入点
- execution(public * * (. .)) 任意公共方法被执行时,执行切入点函数
- execution( * set* (. .)) 任何以一个“set”开始的方法被执行时,执行切入点函数
- execution( * com.demo.service.AccountService.* (. .)) 当接口AccountService 中的任意方法被执行时,执行切入点函数
- execution( * com.demo.service.*.* (. .)) 当service 包中的任意方法被执行时,执行切入点函数
- within(com.demo.service.*) 在service 包里的任意连接点
- within(com.demo.service. .*) 在service 包或子包的任意连接点
- this(com.demo.service.AccountService) 实现了AccountService 接口的代理对象的任意连接点
- target(com.demo.service.AccountService) 实现了AccountService 接口的目标对象的任意连接点
- args(Java.io.Serializable) 任何一个只接受一个参数,且在运行时传入参数实现了 Serializable 接口的连接点
(2)AOP多样的方法
- @Before:方法前执行
- @AfterReturning:运行方法后执行
- @AfterThrowing:Throw后执行
- @After:无论方法以何种方式结束,都会执行(类似于finally)
- @Around:环绕执行