05 使用AOP獲取方法調(diào)用信息

使用AOP獲取服務(wù)層方法調(diào)用信息

通過(guò)前面章節(jié)的學(xué)習(xí)即碗,相信大家已經(jīng)對(duì)AOP有了一定的了解乾翔。
在這一章節(jié)中告嘲,將會(huì)教大家怎么使用AOP來(lái)監(jiān)控Service層方法的調(diào)用赏殃,用日志輸出調(diào)用參數(shù)以及方法調(diào)用時(shí)間等稳强。
可以方便調(diào)試场仲,及性能調(diào)優(yōu)等和悦。

創(chuàng)建AOP

  1. 切點(diǎn)的選擇
    在Spring開發(fā)中,服務(wù)層一般是放在同一個(gè)包里燎窘,這個(gè)時(shí)候我們可以使用這種切點(diǎn)方式:

    execution(* com.learn.service..*(..))
    

    但是不排除某些情況下摹闽,服務(wù)分散到不同的包中,這個(gè)時(shí)候我們可以采用另一種方式褐健,通過(guò)注解來(lái)使用AOP:

    @within(org.springframework.stereotype.Service)
    

    @target(org.springframework.stereotype.Service)
    

    @within和@target的使用可以回顧一下前面的章節(jié)

  2. 使用通知
    為了達(dá)到可以計(jì)算調(diào)用服務(wù)層方法執(zhí)行時(shí)間的目的付鹿,我們?cè)谶@里可以使用環(huán)繞通知的形式,當(dāng)然蚜迅,如果不需要計(jì)算方法執(zhí)行時(shí)間的話舵匾,可以使用前置通知或者后置通知的方式。
    通知的使用可以回顧一下AOP五種通知詳解

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Around(value = "@target(org.springframework.stereotype.Service)")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        Object result;
        long time1 = System.currentTimeMillis();
        try {
            result = pjp.proceed();
        } catch (Throwable throwable) {
            logger.error("\n\n============================================\n"
            + "===errFunc:" + pjp.getSignature()
            + "\n===params:" + Arrays.toString(pjp.getArgs())
            + "\n============================================\n");
            throw throwable;
        }
        long time2 = System.currentTimeMillis();
        logger.info("\n\n============================================\n"
        + "===func:" + pjp.getSignature()
        + "\n===params:" + Arrays.toString(pjp.getArgs())
        + "\n===time:" + (time2-time1) + "ms"
        + "\n===result:" + result
        + "\n============================================\n");
        return result;
    }
    

    到這里谁不,AOP就算寫好了坐梯,下面我們來(lái)測(cè)試一下。

測(cè)試

  1. 創(chuàng)建接口

    public interface IHelloService {
        void sayHello();
    
        void say(String msg);
    
        String err(boolean isThrow);
    }
    
  2. 創(chuàng)建其實(shí)現(xiàn)類

    @Service
    public class HelloServiceImpl implements IHelloService {
        @Override
        public void sayHello() {
            System.out.println("hello");
        }
    
        @Override
        public void say(String msg) {
            System.out.println(msg);
        }
    
        @Override
        public String err(boolean isThrow) {
            System.out.println("error begin");
            if (isThrow) {
                throw new RuntimeException("sss");
            }
            return "this is an error";
        }
    }
    
  3. 創(chuàng)建測(cè)試用例

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Resource
        private IHelloService helloService;
    
        @Test
        public void test1() {
            helloService.sayHello();
        }
    
        @Test
        public void test2() {
            helloService.say("hello");
        }
    
        @Test
        public void test3() {
            helloService.err(true);
        }
    
        @Test
        public void test4() {
            helloService.err(false);
        }
    
    }
    

    執(zhí)行test1可以得到結(jié)果:

    
    ============================================
    ===func:void com.learn.service.IHelloService.sayHello()
    ===params:[]
    ===time:0ms
    ===result:null
    ============================================
    

    執(zhí)行test2可以得到結(jié)果:

    
    ============================================
    ===func:void com.learn.service.IHelloService.say(String)
    ===params:[hello]
    ===time:0ms
    ===result:null
    ============================================
    

    執(zhí)行test3可以得到結(jié)果:

    
    ============================================
    ===errFunc:String com.learn.service.IHelloService.err(boolean)
    ===params:[true]
    ============================================
    
    
    java.lang.RuntimeException: sss
    ...
    

    執(zhí)行test4可以得到結(jié)果:

    
    ============================================
    ===func:String com.learn.service.IHelloService.err(boolean)
    ===params:[false]
    ===time:0ms
    ===result:this is an error
    ============================================
    

目錄
源碼鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刹帕,一起剝皮案震驚了整個(gè)濱河市吵血,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偷溺,老刑警劉巖蹋辅,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挫掏,居然都是意外死亡侦另,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門尉共,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褒傅,“玉大人,你說(shuō)我怎么就攤上這事袄友〉钔校” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵剧蚣,是天一觀的道長(zhǎng)支竹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)券敌,這世上最難降的妖魔是什么唾戚? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任柳洋,我火速辦了婚禮待诅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熊镣。我一直安慰自己卑雁,他們只是感情好募书,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著测蹲,像睡著了一般莹捡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扣甲,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天篮赢,我揣著相機(jī)與錄音,去河邊找鬼琉挖。 笑死启泣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的示辈。 我是一名探鬼主播寥茫,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼矾麻!你這毒婦竟也來(lái)了纱耻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤险耀,失蹤者是張志新(化名)和其女友劉穎弄喘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰耗,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡限次,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柴灯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卖漫。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赠群,靈堂內(nèi)的尸體忽然破棺而出羊始,到底是詐尸還是另有隱情,我是刑警寧澤查描,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布突委,位于F島的核電站,受9級(jí)特大地震影響冬三,放射性物質(zhì)發(fā)生泄漏匀油。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一勾笆、第九天 我趴在偏房一處隱蔽的房頂上張望敌蚜。 院中可真熱鬧,春花似錦窝爪、人聲如沸弛车。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纷跛。三九已至喻括,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贫奠,已是汗流浹背唬血。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唤崭,地道東北人刁品。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像浩姥,于是被迫代替她去往敵國(guó)和親挑随。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理勒叠,服務(wù)發(fā)現(xiàn)兜挨,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法眯分,類相關(guān)的語(yǔ)法拌汇,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法弊决,異常的語(yǔ)法噪舀,線程的語(yǔ)...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • Spring AOP五種通知詳解 spring aop通知(advice)分成五類: 前置通知Before adv...
    幽暗金閱讀 4,085評(píng)論 0 1
  • 一步一步的搭建JAVA WEB項(xiàng)目,采用Maven構(gòu)建飘诗,基于MYBatis+Spring+Spring MVC+B...
    葉子的翅膀閱讀 12,640評(píng)論 5 25
  • 十一月的共青刮起了寒風(fēng) 水龍頭里的水變得有些刺骨的涼 早上出門看著衣柜發(fā)呆 不知道該穿什么 以前總愛(ài)在做操的時(shí)候抓...
    一顆橙子一顆柚子閱讀 158評(píng)論 0 0