spring boot aop 記錄方法執行時間

前言

爲了性能調優,需要先統計出來每個方法的執行時間,直接在方法前後log輸出太麻煩,可以用AOP來加入時間統計

添加依賴

<dependency>    
 <groupId>org.springframework.boot</groupId>    
 <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在application.properties中加入配置

spring.aop.auto=true

spring.aop.auto屬性默認是開啓的,也就是說只要引入了AOP依賴後,默認已經增加了@EnableAspectJAutoProxy。 切記千萬不要加入多餘的信息,如@EnableAspectJAutoProxy!

實現具體代碼

@Component
@Aspect
public class LogAspect {
	private static final Log LOG = LogFactory.getLog(LogAspect.class);
	
	   /**
     * 定義一個切入點.
     * 解釋下:
     *
     * ~ 第一個 * 代表任意修飾符及任意返回值.
     * ~ 第二個 * 定義在web包或者子包
     * ~ 第三個 * 任意方法
     * ~ .. 匹配任意數量的參數.
     */
     @Pointcut("execution(* com.wedo.stream.service..*.*(..))")
     public void logPointcut(){}
     @org.aspectj.lang.annotation.Around("logPointcut()")

     public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
//    	 LOG.debug("logPointcut " + joinPoint + "\t");
 		long start = System.currentTimeMillis();
 		try {
 			Object result = joinPoint.proceed();
 			long end = System.currentTimeMillis();
 			LOG.error("+++++around " + joinPoint + "\tUse time : " + (end - start) + " ms!");
 			return result; 

 		} catch (Throwable e) {
 			long end = System.currentTimeMillis();
 			LOG.error("+++++around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage());
 			throw e;
 		}

     }

}

注意問題

  • aop後方法不能正確返回值
    這個代理方法一定要返回值,否則,在代碼中就沒有返回值了。

    //這樣是不對的
      public void doAround(ProceedingJoinPoint joinPoint){}
  • Spring的文檔中這麼寫的:Spring AOP部分使用JDK動態代理或者CGLIB來爲目標對象創建代理。如果被代理的目標實現了至少一個接口,則會使用JDK動態代理。所有該目標類型實現的接口都將被代理。若該目標對象沒有實現任何接口,則創建一個CGLIB代理。
    默認是JDK動態代理,更改爲cglib

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章