本文研究的主要是spring boot aop 記錄方法執行時間的實現代碼,具體如下。
為了性能調優,需要先統計出來每個方法的執行時間,直接在方法前後log輸出太麻煩,可以用AOP來加入時間統計
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>
spring.aop.auto=true
spring.aop.auto屬性默認是開啟的,也就是說只要引入了AOP依賴後,默認已經增加了@EnableAspectJAutoProxy。 切記千萬不要加入多餘的信息,如@EnableAspectJAutoProxy!
@Component@Aspectpublic 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
以上就是本文關於spring boot aop 記錄方法執行時間代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!