spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例
本文研究的主要是spring boot aop 記錄方法執(zhí)行時(shí)間的實(shí)現(xiàn)代碼,具體如下。
為了性能調(diào)優(yōu),需要先統(tǒng)計(jì)出來(lái)每個(gè)方法的執(zhí)行時(shí)間,直接在方法前后log輸出太麻煩,可以用AOP來(lái)加入時(shí)間統(tǒng)計(jì)
添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
在application.properties中加入配置
spring.aop.auto=true
spring.aop.auto屬性默認(rèn)是開(kāi)啟的,也就是說(shuō)只要引入了AOP依賴后,默認(rèn)已經(jīng)增加了@EnableAspectJAutoProxy。 切記千萬(wàn)不要加入多余的信息,如@EnableAspectJAutoProxy!
實(shí)現(xiàn)具體代碼
@Component
@Aspect
public class LogAspect {
private static final Log LOG = LogFactory.getLog(LogAspect.class);
/**
* 定義一個(gè)切入點(diǎn).
* 解釋下:
*
* ~ 第一個(gè) * 代表任意修飾符及任意返回值.
* ~ 第二個(gè) * 定義在web包或者子包
* ~ 第三個(gè) * 任意方法
* ~ .. 匹配任意數(shù)量的參數(shù).
*/
@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;
}
}
}
注意問(wèn)題
aop后方法不能正確返回值
這個(gè)代理方法一定要返回值,否則,在代碼中就沒(méi)有返回值了。
//這樣是不對(duì)的
public void doAround(ProceedingJoinPoint joinPoint){}
Spring的文檔中這么寫(xiě)的:Spring AOP部分使用JDK動(dòng)態(tài)代理或者CGLIB來(lái)為目標(biāo)對(duì)象創(chuàng)建代理。如果被代理的目標(biāo)實(shí)現(xiàn)了至少一個(gè)接口,則會(huì)使用JDK動(dòng)態(tài)代理。所有該目標(biāo)類型實(shí)現(xiàn)的接口都將被代理。若該目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,則創(chuàng)建一個(gè)CGLIB代理。
默認(rèn)是JDK動(dòng)態(tài)代理,更改為cglib
總結(jié)
以上就是本文關(guān)于spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
關(guān)于SpringBoot中事務(wù)失效的幾種情況
這篇文章主要介紹了關(guān)于SpringBoot中事務(wù)失效的幾種情況,Spring AOP默認(rèn)使用動(dòng)態(tài)代理,會(huì)給被代理的類生成一個(gè)代理類,事務(wù)相關(guān)的操作都通過(guò)代理來(lái)完成,使用內(nèi)部方法調(diào)用時(shí),使用的是實(shí)例調(diào)用,沒(méi)有通過(guò)代理類調(diào)用方法,因此事務(wù)不會(huì)檢測(cè)到失敗,需要的朋友可以參考下2023-08-08
Spring @Bean vs @Service注解區(qū)別
本篇文章主要介紹了Spring @Bean vs @Service注解區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Java中zip的壓縮和解壓縮的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中zip的壓縮和解壓縮的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

