1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Springboot使用Aspect實現(xiàn)切面日志

        共 5032字,需瀏覽 11分鐘

         ·

        2021-10-24 17:55

        點擊上方“程序員大白”,選擇“星標”公眾號

        重磅干貨,第一時間送達

        前言

        今天我們來說說spring中的切面Aspect,這是Spring的一大優(yōu)勢。面向切面編程往往讓我們的開發(fā)更加低耦合,也大大減少了代碼量,同時呢讓我們更專注于業(yè)務模塊的開發(fā),把那些與業(yè)務無關的東西提取出去,便于后期的維護和迭代。

        好了,廢話少說!我們直接步入正題

        以系統(tǒng)日志為例

        首先,我們先做一些準備工作。

        1、新建一個Springboot工程

        2、添加必要的依賴

        AOP 必須

        <dependency>
        ?<groupId>org.springframework.bootgroupId>
        ?<artifactId>spring-boot-starter-aopartifactId>
        dependency>

        gson主要是我用于數(shù)據(jù)的處理,不是必須的

        <dependency>
        ?<groupId>com.google.code.gsongroupId>
        ?<artifactId>gsonartifactId>
        ?<version>2.8.1version>
        dependency>

        個人喜好

        <dependency>
        ?<groupId>org.springframework.bootgroupId>
        ?<artifactId>spring-boot-devtoolsartifactId>
        ?<scope>runtimescope>
        dependency>
        <dependency>
        ?<groupId>org.projectlombokgroupId>
        ?<artifactId>lombokartifactId>
        ?<optional>trueoptional>
        dependency>

        3、日志實體類和service

        package?com.space.aspect.bo;
        ?
        import?lombok.Data;
        ?
        /**
        ?*?系統(tǒng)日志bo
        ?*?@author?zhuzhe
        ?*/

        @Data
        public?class?SysLogBO?{
        ?
        ????private?String?className;
        ?
        ????private?String?methodName;
        ?
        ????private?String?params;
        ?
        ????private?Long?exeuTime;
        ?
        ????private?String?remark;
        ?
        ????private?String?createDate;
        }
        package?com.space.aspect.service;
        ?
        import?com.space.aspect.bo.SysLogBO;
        import?lombok.extern.slf4j.Slf4j;
        import?org.springframework.stereotype.Service;
        ?
        /**
        ?*?@author?zhuzhe
        ?*/

        @Slf4j
        @Service
        public?class?SysLogService?{
        ?
        ????public?boolean?save(SysLogBO?sysLogBO){
        ????????//?這里就不做具體實現(xiàn)了
        ????????log.info(sysLogBO.getParams());
        ????????return?true;
        ????}
        }

        4、定義日志注解

        這里呢,我們記錄日志使用注解的形式。所以,先定義一個注解

        package?com.space.aspect.anno;
        ?
        import?java.lang.annotation.*;
        ?
        /**
        ?*?定義系統(tǒng)日志注解
        ?*?@author?zhuzhe
        ?*/

        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        public?@interface?SysLog?{
        ????String?value()?default?"";
        }

        5、聲明切面,完成日志記錄

        以上4點我們的準備工作已經(jīng)完成。接下來就是重點了

        這里需要你對AOP有一定的了解。起碼知道切點表達式、環(huán)繞通知、前置通知、后置通知等。。。

        package?com.space.aspect.aspect;
        ?
        import?com.google.gson.Gson;
        import?com.space.aspect.anno.SysLog;
        import?com.space.aspect.bo.SysLogBO;
        import?com.space.aspect.service.SysLogService;
        import?org.aspectj.lang.ProceedingJoinPoint;
        import?org.aspectj.lang.annotation.Around;
        import?org.aspectj.lang.annotation.Aspect;
        import?org.aspectj.lang.annotation.Pointcut;
        import?org.aspectj.lang.reflect.MethodSignature;
        import?org.springframework.beans.factory.annotation.Autowired;
        import?org.springframework.stereotype.Component;
        ?
        import?java.lang.reflect.Method;
        import?java.text.SimpleDateFormat;
        import?java.util.ArrayList;
        import?java.util.Date;
        import?java.util.List;
        ?
        /**
        ?*?系統(tǒng)日志切面
        ?*?@author?zhuzhe
        ?*/

        @Aspect??//?使用@Aspect注解聲明一個切面
        @Component
        public?class?SysLogAspect?{
        ?
        ????@Autowired
        ????private?SysLogService?sysLogService;
        ?
        ????/**
        ?????*?這里我們使用注解的形式
        ?????*?當然,我們也可以通過切點表達式直接指定需要攔截的package,需要攔截的class?以及?method
        ?????*?切點表達式:???execution(...)
        ?????*/

        ????@Pointcut("@annotation(com.space.aspect.anno.SysLog)")
        ????public?void?logPointCut()?{}
        ?
        ????/**
        ?????*?環(huán)繞通知?@Around??,?當然也可以使用?@Before?(前置通知)??@After?(后置通知)
        ?????*?@param?point
        ?????*?@return
        ?????*?@throws?Throwable
        ?????*/

        ????@Around("logPointCut()")
        ????public?Object?around(ProceedingJoinPoint?point)?throws?Throwable?{
        ????????long?beginTime?=?System.currentTimeMillis();
        ????????Object?result?=?point.proceed();
        ????????long?time?=?System.currentTimeMillis()?-?beginTime;
        ????????try?{
        ????????????saveLog(point,?time);
        ????????}?catch?(Exception?e)?{
        ????????}
        ????????return?result;
        ????}
        ?
        ????/**
        ?????*?保存日志
        ?????*?@param?joinPoint
        ?????*?@param?time
        ?????*/

        ????private?void?saveLog(ProceedingJoinPoint?joinPoint,?long?time)?{
        ????????MethodSignature?signature?=?(MethodSignature)?joinPoint.getSignature();
        ????????Method?method?=?signature.getMethod();
        ????????SysLogBO?sysLogBO?=?new?SysLogBO();
        ????????sysLogBO.setExeuTime(time);
        ????????SimpleDateFormat?dateFormat?=?new?SimpleDateFormat("yyyy-MM-dd?hh:mm:ss");
        ????????sysLogBO.setCreateDate(dateFormat.format(new?Date()));
        ????????SysLog?sysLog?=?method.getAnnotation(SysLog.class);
        ????????if(sysLog?!=?null){
        ????????????//注解上的描述
        ????????????sysLogBO.setRemark(sysLog.value());
        ????????}
        ????????//請求的?類名、方法名
        ????????String?className?=?joinPoint.getTarget().getClass().getName();
        ????????String?methodName?=?signature.getName();
        ????????sysLogBO.setClassName(className);
        ????????sysLogBO.setMethodName(methodName);
        ????????//請求的參數(shù)
        ????????Object[]?args?=?joinPoint.getArgs();
        ????????try{
        ????????????List?list?=?new?ArrayList();
        ????????????for?(Object?o?:?args)?{
        ????????????????list.add(new?Gson().toJson(o));
        ????????????}
        ????????????sysLogBO.setParams(list.toString());
        ????????}catch?(Exception?e){?}
        ????????sysLogService.save(sysLogBO);
        ????}
        }

        6、測試

        接下來,我們就來測試一下吧

        package?com.space.aspect.controller;
        ?
        import?com.space.aspect.anno.SysLog;
        import?org.springframework.web.bind.annotation.GetMapping;
        import?org.springframework.web.bind.annotation.RequestParam;
        import?org.springframework.web.bind.annotation.RestController;
        ?
        /**
        ?*?@author?zhuzhe
        ?*/

        @RestController
        public?class?TestController?{
        ?
        ????@SysLog("測試")
        ????@GetMapping("/test")
        ????public?String?test(@RequestParam("name")?String?name){
        ????????return?name;
        ????}
        }

        啟動項目,訪問我們的test方法。

        我們在service里打一個斷點

        可以看到,我們所需要的值都成功拿到了。

        這樣,我們就成功實現(xiàn)了使用Aspect實現(xiàn)切面記錄日志。

        源碼:https://github.com/zhuzhegithub/springboot-aop-aspect

        來源:blog.csdn.net/zhuzhezhuzhe1/

        article/details/80565067


        中國聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶推廣色情APP

        張一鳴:每個逆襲的年輕人,都具備的底層能力

        色情版“微信”背后的秘密

        200元人民幣面世!




        ,西質(zhì),[],!


        瀏覽 37
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲乱码一区二区三区 | 亚洲国产色情 | 日韩黄片在线播放 | 污污的网站免费观看 | 99久久99久久久国产精品青草 | 特级婬片内谢A片AAA毛片古代 | 日本大尺度吃奶做爰视频 | 偷拍精偷拍精品欧洲亚洲网站 | 皇上虐孕边做产生乱h高h男男 | 五月丁香中文字幕 |