Spring AOP 注解打印 方法執(zhí)行時(shí)間

問(wèn)題

工作上經(jīng)常遇到一些響應(yīng)很慢的接口趁尼,例如我在做營(yíng)銷引擎時(shí)剩蟀,遇到多個(gè)規(guī)則在一個(gè)定時(shí)器里舷夺,這個(gè)定時(shí)器的運(yùn)行時(shí)間突然暴增苦酱。所以我想定位一下是哪條規(guī)則執(zhí)行了這么長(zhǎng)時(shí)間?

簡(jiǎn)單解決方法

  1. 最基礎(chǔ)的用法给猾,通過(guò)系統(tǒng)時(shí)間
long start = System.currentTimeMillis();
// doSomthing
long spentTime = System.currentTimeMillis() -start;

2疫萤、使用spring封裝的類

StopWatch stopWatch = new StopWatch();
stopWatch.start();
// doSomthing        
stopWatch.stop();
stopWatch.getTotalTimeMillis();

分析

以上的解決方法是最常用的,也是我一開(kāi)始使用的敢伸,但當(dāng)我遇到多個(gè)規(guī)則要打印時(shí)間扯饶,會(huì)發(fā)現(xiàn)有很多重復(fù)的代碼,很不美觀池颈,費(fèi)力不討好尾序。這時(shí)候我想到了面向切面編程(AOP),通過(guò)注解的方式打印時(shí)間躯砰。

切面使用場(chǎng)景

我們知道有面向?qū)ο缶幊蹋∣OP)每币,面想接口編程(IOP),它們其實(shí)都是相輔相成的琢歇,面向切面編程讓程序員能專注于核心業(yè)務(wù)開(kāi)發(fā)兰怠,像一些輔助功能:性能檢測(cè)梦鉴,權(quán)限問(wèn)題,日志打印揭保,運(yùn)行時(shí)間肥橙,事務(wù)等等,這些不涉及業(yè)務(wù)開(kāi)發(fā)秸侣,但又不想遍地都是一樣的代碼快骗,可以用AOP實(shí)現(xiàn)

例子

好的,有了以上的了解塔次,現(xiàn)在讓我們看看AOP怎么實(shí)現(xiàn)注解打印方法執(zhí)行時(shí)間吧

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExecuteTime {
    String name() default "";
}

想通過(guò)注解方式打印方篮,首先先得寫個(gè)注解

@Aspect
@Component
public class ExecuteTimeAspect {

    private final Logger logger = LoggerFactory.getLogger(ExecuteTimeAspect.class);

    @Pointcut("@annotation(executeTime)")
    public void serviceExecutionTimeLog(ExecuteTime executeTime) {
    }


    @Around(value = "serviceExecutionTimeLog(executeTime)", argNames = "proceedingJoinPoint,executeTime")
    public Object doAfter(ProceedingJoinPoint proceedingJoinPoint, ExecuteTime executeTime) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object proceed = proceedingJoinPoint.proceed();
        stopWatch.stop();

        logger.info("execute-time-name : [{}], execution-time : [{}], class-method : [{}]", executeTime.name(),
                stopWatch.getTotalTimeMillis(),
                proceedingJoinPoint.getTarget().getClass().getName() + "." + proceedingJoinPoint.getSignature().getName());


        return proceed;
    }
}
  1. 先定義一個(gè)切面 apsect
  2. 定義切點(diǎn) pointcut ,描述哪些join point(方法的連接點(diǎn))需要被執(zhí)行励负,這里是通過(guò)注解的方式才被執(zhí)行藕溅,你也可以有其它的描述方式定義你的切點(diǎn)范圍
  3. 定義執(zhí)行方法前后要執(zhí)行的相關(guān)操作 around 。 其中继榆,Object proceed = proceedingJoinPoint.proceed(); 表示函數(shù)執(zhí)行巾表,它的前后我用開(kāi)始時(shí)間和結(jié)束時(shí)間圍住,
  4. 最后打印 執(zhí)行自定義名字(自己起個(gè)名字略吨,便于線上快速批量打印你想看的數(shù)據(jù))集币,執(zhí)行方法名字和執(zhí)行的時(shí)間
@Override
@ExecuteTime(name = "user-defined")
public void calculate(){
// TODO
}

在實(shí)現(xiàn)的接口上去注解就能使用了

衍生問(wèn)題

  1. 我想看看spring 事務(wù)注解 源碼如何實(shí)現(xiàn)?

參考

  1. https://segmentfault.com/a/1190000007469982#articleHeader2
  2. http://www.reibang.com/p/7b072f31bd1d

如果你有不同的想法翠忠,歡迎留言討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞠苟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秽之,更是在濱河造成了極大的恐慌当娱,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件考榨,死亡現(xiàn)場(chǎng)離奇詭異跨细,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)河质,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門冀惭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掀鹅,你說(shuō)我怎么就攤上這事散休。” “怎么了淫半?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵溃槐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我科吭,道長(zhǎng)昏滴,這世上最難降的妖魔是什么猴鲫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮谣殊,結(jié)果婚禮上拂共,老公的妹妹穿的比我還像新娘。我一直安慰自己姻几,他們只是感情好宜狐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛇捌,像睡著了一般抚恒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上络拌,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天俭驮,我揣著相機(jī)與錄音,去河邊找鬼春贸。 笑死混萝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萍恕。 我是一名探鬼主播逸嘀,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允粤!你這毒婦竟也來(lái)了崭倘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤维哈,失蹤者是張志新(化名)和其女友劉穎绳姨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阔挠,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年脑蠕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了购撼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谴仙,死狀恐怖迂求,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晃跺,我是刑警寧澤揩局,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站掀虎,受9級(jí)特大地震影響凌盯,放射性物質(zhì)發(fā)生泄漏付枫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一驰怎、第九天 我趴在偏房一處隱蔽的房頂上張望阐滩。 院中可真熱鬧,春花似錦县忌、人聲如沸掂榔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)装获。三九已至,卻和暖如春厉颤,著一層夾襖步出監(jiān)牢的瞬間穴豫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工走芋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绩郎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓翁逞,卻偏偏與公主長(zhǎng)得像肋杖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挖函,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容