前言
爲了性能調優,需要先統計出來每個方法的執行時間,直接在方法前後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