spring aop 自動打印接口的出入?yún)⒐サ屇愀鼘W⒂跇I(yè)務(wù)邏輯

簡介

AOP意為“面向切面編程”,這樣的名字并不是非常容易理解,且容易產(chǎn)生一些誤導(dǎo)冕房。AOP是新一代軟件開發(fā)方式”躏啰,在Spring中提供了面向切面編程的豐富支持,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級服務(wù)(例如審計(auditing)和事務(wù)(transaction)管理)進行內(nèi)聚性的開發(fā)耙册。應(yīng)用對象只實現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已给僵。它們并不負(fù)責(zé)(甚至是意識)其它的系統(tǒng)級關(guān)注點,例如日志或事務(wù)支持详拙。
AOP主要功能有 日志記錄帝际,性能統(tǒng)計,安全控制饶辙,事務(wù)處理蹲诀,異常處理。

OK弃揽,教程走起脯爪。。矿微。痕慢。(看完保證你不再手動打印出入?yún)⒘松?/em>)

PS:本教程是基于spring boot項目講解的

1、第一步肯定是新建項目涌矢,引入依賴?yán)?/h2>

pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-logback-async</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-logback-async</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- 構(gòu)建成可運行的Web項目 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
                <!--  AOP 依賴必須加進來-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <!-- 打印日志需要 -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2掖举、新建兩個實體類 UserDto、Result娜庇,代碼如下:

import lombok.Data;

/**
 * body入?yún)? */
@Data
public class UserDto {
    private String userId;
    private String userName;
}
import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 返回對象
 * @param <T>
 */
@Data
@AllArgsConstructor
public class Result<T> {

    private static final int success = 0;
    private static final int fail = -1;

    private static final String successMsg = "請求成功";
    private static final String failMsg = "請求失敗";

    private int code;
    private String message;
    private T data;
    
    public static <T> Result<T> returnSuccess(T data) {
        return new Result<T>(success, successMsg, data);
    }

    public static <T> Result<T> returnFail(T data) {
        return new Result<T>(fail, failMsg, null);
    }
}

3塔次、新建一個測試接口類InitRest

import com.example.demo.dto.UserDto;
import com.example.demo.model.Result;
import org.springframework.web.bind.annotation.*;

//使用restful風(fēng)格
@RestController
public class InitRest {
    //測試get入?yún)?    @GetMapping("/hello")
    public Result<String> hello(@RequestParam String userId) {
        return Result.returnSuccess("Hello get...");
    }
    //測試body入?yún)?    @PostMapping("/hello")
    public Result<UserDto> hello(@RequestBody UserDto userDto) {
        userDto.setUserId("你的名字被修改啦方篮。。励负。");
        return Result.returnSuccess(userDto);
    }
}

4藕溅、關(guān)鍵的一步,新建一個AOP類:WebLog.java

import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
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.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

@Slf4j
//下面兩個注解是必須的熄守,少一個都不行哦
@Aspect
@Configuration
public class WebLog {

    //標(biāo)記切入點蜈垮,為指定包下的所有類的所有public方法
    @Pointcut(value = "execution(public * com.example.demo.rest.*.* (*))")
    public void webLog() {
    }

    @Around(value = "webLog()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String requestId = UUID.randomUUID().toString().replace("-", "");
        //打印入?yún)?        log.info("requestId={},請求入?yún)?{}", requestId, new Gson().toJson(joinPoint.getArgs()));

        Object object = joinPoint.proceed();
        //打印出參
        log.info("requestId={},請求出參 {}", requestId, new Gson().toJson(object));
        return object;
    }
}

5、OK裕照,整完了攒发,看一下目前的目錄結(jié)構(gòu):

目錄結(jié)構(gòu)

6、啟動項目晋南,訪問接口惠猿,注意看日志打印哦

啟動成功

get請求

get請求日志

post請求

post請求日志

OK,完美實現(xiàn)负间,出入?yún)⑷罩敬蛴∨佳朔ê唵斡址奖悖泐I(lǐng)會了嘛政溃?趾访??

關(guān)于此教程用到的幾個注解董虱,有不太清楚的朋友可留言詢問哦扼鞋!

OK,若覺得本文還不錯愤诱,記得點贊評論加轉(zhuǎn)發(fā)哦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末云头,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淫半,更是在濱河造成了極大的恐慌溃槐,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件科吭,死亡現(xiàn)場離奇詭異昏滴,居然都是意外死亡,警方通過查閱死者的電腦和手機对人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門影涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规伐,你說我怎么就攤上這事∠辉担” “怎么了猖闪?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵鲜棠,是天一觀的道長。 經(jīng)常有香客問我培慌,道長豁陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任吵护,我火速辦了婚禮盒音,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馅而。我一直安慰自己祥诽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布瓮恭。 她就那樣靜靜地躺著雄坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屯蹦。 梳的紋絲不亂的頭發(fā)上维哈,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音登澜,去河邊找鬼阔挠。 笑死,一個胖子當(dāng)著我的面吹牛脑蠕,可吹牛的內(nèi)容都是我干的购撼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼空郊,長吁一口氣:“原來是場噩夢啊……” “哼份招!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狞甚,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锁摔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哼审,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谐腰,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年涩盾,在試婚紗的時候發(fā)現(xiàn)自己被綠了十气。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡春霍,死狀恐怖砸西,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤芹枷,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布衅疙,位于F島的核電站,受9級特大地震影響鸳慈,放射性物質(zhì)發(fā)生泄漏饱溢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一走芋、第九天 我趴在偏房一處隱蔽的房頂上張望绩郎。 院中可真熱鬧,春花似錦翁逞、人聲如沸肋杖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兽愤。三九已至,卻和暖如春挪圾,著一層夾襖步出監(jiān)牢的瞬間浅萧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工哲思, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼畅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓棚赔,卻偏偏與公主長得像帝簇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靠益,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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