aop注解配置切點 spring_springboot aop 自定義注解方式實現一套完善的日志記錄

一:功能簡介

本文主要記錄如何使用aop切面的方式來實現日志記錄功能。

主要記錄的信息有: 操作人,方法名,參數,運行時間,操作類型(增刪改查),詳細描述,返回值。

二:項目結構圖

e1096f65eb6d8072b2ab5902d70aa84e.png

如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

三:代碼實現

1.配置文件

這里只有兩個配置:1)server.port=11000,設置項目啟動的端口號,防止被其他服務占用;2)spring.aop.auto=true,開啟spring的aop配置,簡單明了,不需要多配置其他的配置或注解。application.yml文件server: port: 11000spring: aop: auto: true #啟動aop配置

2.AOP切點類

這個是最主要的類,可以使用自定義注解或針對包名實現AOP增強。

1)這里實現了對自定義注解的環繞增強切點,對使用了自定義注解的方法進行AOP切面處理;

2)對方法運行時間進行監控;

3)對方法名,參數名,參數值,對日志描述的優化處理;

在方法上增加@Aspect 注解聲明切面,使用@Pointcut 注解定義切點,標記方法。

使用切點增強的時機注解:@Before,@Around,@AfterReturning,@AfterThrowing,@After

package com.wwj.springboot.aop;import com.alibaba.fastjson.JSON;import com.wwj.springboot.annotation.OperationLogDetail;import com.wwj.springboot.model.OperationLog;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.UUID;/** * Created by IntelliJ IDEA * * @author weiwenjun * @date 2018/9/12 */@Aspect@Componentpublic class LogAspect { /** * 此處的切點是注解的方式,也可以用包名的方式達到相同的效果 * '@Pointcut("execution(* com.wwj.springboot.service.impl.*.*(..))")' */ @Pointcut("@annotation(com.wwj.springboot.annotation.OperationLogDetail)") public void operationLog(){} /** * 環繞增強,相當于MethodInterceptor */ @Around("operationLog()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { Object res = null; long time = System.currentTimeMillis(); try { res = joinPoint.proceed(); time = System.currentTimeMillis() - time; return res; } finally { try { //方法執行完成后增加日志 addOperationLog(joinPoint,res,time); }catch (Exception e){ System.out.println("LogAspect 操作失敗:" + e.getMessage()); e.printStackTrace(); } } } private void addOperationLog(JoinPoint joinPoint, Object res, long time){ MethodSignature signature = (MethodSignature)joinPoint.getSignature(); OperationLog operationLog = new OperationLog(); operationLog.setRunTime(time); operationLog.setReturnValue(JSON.toJSONString(res)); operationLog.setId(UUID.randomUUID().toString()); operationLog.setArgs(JSON.toJSONString(joinPoint.getArgs())); operationLog.setCreateTime(new Date()); operationLog.setMethod(signature.getDeclaringTypeName() + "." + signature.getName()); operationLog.setUserId("#{currentUserId}"); operationLog.setUserName("#{currentUserName}"); OperationLogDetail annotation = signature.getMethod().getAnnotation(OperationLogDetail.class); if(annotation != null){ operationLog.setLevel(annotation.level()); operationLog.setDescribe(getDetail(((MethodSignature)joinPoint.getSignature()).getParameterNames(),joinPoint.getArgs(),annotation)); operationLog.setOperationType(annotation.operationType().getValue()); operationLog.setOperationUnit(annotation.operationUnit().getValue()); } //TODO 這里保存日志 System.out.println("記錄日志:" + operationLog.toString());// operationLogService.insert(operationLog); } /** * 對當前登錄用戶和占位符處理 * @param argNames 方法參數名稱數組 * @param args 方法參數數組 * @param annotation 注解信息 * @return 返回處理后的描述 */ private String getDetail(String[] argNames, Object[] args, OperationLogDetail annotation){ Map map = new HashMap<>(4); for(int i = 0;i < argNames.length;i++){ map.put(argNames[i],args[i]); } String detail = annotation.detail(); try { detail = "'" + "#{currentUserName}" + "'=》" + annotation.detail(); for (Map.Entry entry : map.entrySet()) { Object k = entry.getKey(); Object v = entry.getValue(); detail = detail.replace("{{" + k + "}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抽象類、接口的區別和相似點

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; abs…

c標簽判斷true false jsp_Java學習知識點:小白如何掌握JSP技術?

今天千鋒廣州小編就給大家分享零基礎如何掌握JSP技術&#xff0c;下面一起來看看吧!一、Java初級開發之jsp概述1.關于jspJavaServer Pages簡稱jsp&#xff0c;從“server”這個詞可以看出&#xff0c;這其實也是一門java服務端技術&#xff0c;其實可以簡單的把jsp認為是servle…

python語言保留字的特點_python保留字及其說明

原博文 2019-07-14 22:05 ? 保留字 說 明 and 用于表達式運算&#xff0c;邏輯與操作 as 用于類型轉換 assert 斷言&#xff0c;用于判斷變量或條件表達式的值是否為真 break 中斷循環語句的執行 class 用于定義類 continue 繼續執行下一次循環 ...011647 相關推薦 2019-12-19…

使用Java操作Redis的兩種方式Jedis、RedisTemplate

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

python提取數據庫數據_Python如何讀取MySQL數據庫表數據

本文實例為大家分享了Python讀取MySQL數據庫表數據的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 環境&#xff1a;Python 3.6 ,Window 64bit 目的&#xff1a;從MySQL數據庫讀取目標表數據&#xff0c;并處理 代碼&#xff1a; # -*- coding: utf-8 -*- import p…

【項目實戰】基于Redis實現短信驗證碼登錄 (附源碼、思路)

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

加工中心刻字宏程序_FANUC OI系列圖書——車床、銑床及加工中心編程

? 這是金屬加工(mw1950pub)發布的第10035篇文章導讀今天跟大家分享FANUC OI系列圖書&#xff0c;包括車床、銑床及加工中心編程&#xff0c;快來看看吧&#xff01;《FANUC 0i數控車床/加工中心編程技巧與實例》選擇在企業里應用*廣泛、編程*具代表性的日本FANUCSeries0i-TC/T…

Redis 的緩存策略

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

python顯示數據長度_python – 獲取CSV的長度以顯示進度

我正在處理大量CSV文件,每個文件都包含大量行.我的目標是逐行獲取數據并使用 Python將其寫入數據庫.但是,由于存在大量數據,我希望能夠跟蹤已寫入的數據量.為此,我計算了排隊的文件數量,并在每次文件完成時繼續添加一個文件. 我想為CSV文件做類似的事情并顯示我在哪一行,以及總…

關閉后天 樹莓派_陪你一起玩樹莓派-系統安裝

從今天就開始我們的樹莓派之旅&#xff0c;心情是不是有點小激動&#xff1f;我們拿到一個樹莓派是一個裸機。我們要準備一張16G的高速TF閃存卡&#xff0c;一個5V/2A的USB電源和一根micro B的 usb線。裝機步驟&#xff1a;一、下載樹莓派系統1、瀏覽器打開樹莓派官方網站 http…

簡單的簽到代碼_PHP實現一個小小的簽到功能,到底用MySQL還是Redis?

來源 | http://suo.im/5EWN3k今天&#xff0c;看下簽到功能怎么選擇&#xff1f;現在的網站和app開發中&#xff0c;簽到是一個很常見的功能&#xff0c;如微博簽到送積分&#xff0c;簽到排行榜~微博簽到如移動app &#xff0c;簽到送流量等活動&#xff0c;移動app簽到用戶簽…

【Redis 6】緩存穿透、緩存雪崩、緩存擊穿(附解決方案、代碼)

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

8軟件遇到的問題及解決方法_Excel工作表中的8個常見問題,你一定遇到過,附解決方法...

在Excel工作表中&#xff0c;最常用的還是一些技巧&#xff0c;如果能夠熟練掌握&#xff0c;對于工作效率的提高絕對不是一點點哦&#xff0c;結合工作實際&#xff0c;小編對工作中常見的問題進行了總結&#xff0c;一共有8類&#xff0c;你一定也遇到過……一、Excel工作表常…

unity著色器和屏幕特效開發秘笈_Oculus研發分享:開發移動VR內容時應避免的PC渲染技術...

查看引用/信息源請點擊&#xff1a;映維網開發移動VR內容時應避免的PC渲染技術&#xff08;映維網 2019年11月25日&#xff09;有不少開發者都是以與PC相同的方式來開發Quest游戲&#xff0c;但這可能會導致優化性能方面出現大量困難。Oculus軟件工程師特雷弗達什&#xff08;T…

Java包裝類、java中的方法傳參機制:按值調用

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 方法…

尤克里里怎么樣_尤克里里和吉他區別?尤克里里與吉他相比有什么不可替代的優勢...

尤克里里和吉他有什么區別&#xff1f;想必大家都見過尤克里里吧&#xff0c;就是類似吉他形狀的一種小型弦撥樂器。我們可以簡單的認為&#xff1a;尤克里里是簡化版本的吉他&#xff0c;更加簡單&#xff0c;更加便宜。小編彈的就是尤克里里2.從外觀上&#xff1a;吉他很大&a…

餓漢懶漢單例設計模式的使用及區別、java中的import關鍵字

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

廣電運通不好進嗎_我可以說鄭州新風的安裝大部分都是垃圾嗎?

說鄭州的新風安裝都是垃圾&#xff0c;這話很無禮&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能說確實是這樣嘛&#xff1f;其實包括我以前安裝的也不合格——雖然我不是故意的。這幾年見過許多家同行安裝的新風&#xff0c;可以說目前見到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

atlas安裝需要kafka嗎_Atlas 2.1.0 實踐(2)—— 安裝Atlas

在完成Atlas編譯以后&#xff0c;就可以進行Atlas的安裝了。Atlas的安裝主要是安裝Atlas的Server端&#xff0c;也就Atlas的管理頁面&#xff0c;并確保Atlas與Kafka Hbase Solr等組件的集成。Atlas的系統架構如下&#xff0c;在確保 底層在完成Atlas編譯以后&#xff0c;就可以…