公共字段填充(AOP的使用)

Thread是線程池,ThreadLocal是線程變量,每個線程變量是封閉的,與其它線程變量分隔開來,在sky-common下的com.sky.context包下有一個Basecontext類

public class BaseContext {//每一個上下文創建了一個線程變量,用來存儲long類型的id//創建三個方法,用來設置,取用,刪除idpublic static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}

在jwt攔截器中我們會將前端傳過來的id設置到當前線程中

public class JwtTokenAdminInterceptor implements HandlerInterceptor {@Autowiredprivate JwtProperties jwtProperties;/*** 校驗jwt** @param request* @param response* @param handler* @return* @throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("當線程的id"+Thread.currentThread().getId());//判斷當前攔截到的是Controller的方法還是其他資源if (!(handler instanceof HandlerMethod)) {//當前攔截到的不是動態方法,直接放行return true;}//1、從請求頭中獲取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());//2、校驗令牌try {log.info("jwt校驗:{}", token);//這個Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info("當前員工id:", empId);//這里BaseContext.setCurrentId(empId);//3、通過,放行return true;} catch (Exception ex) {//4、不通過,響應401狀態碼response.setStatus(401);return false;}}
}

緊接著想要使用AOP我們需要定義一個AutoFill注解

//表示注解到方法上
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)//表示注解運行時仍保留
public @interface AutoFill {//在common包下,包含insert和update兩種操作OperationType value();
}

然后我們就可以在AutoFillAspect對指定包下滿足條件的方法進行攔截和處理

@Aspect
@Component
@Slf4j
public class AutoFillAspect {//為首的*表示返回類型為任意,com.sky.mapper.*.*這個表示//mapper包下所有的類(..)所有方法,&&后面表示加了AutoFill注解的方法//指定被攔截的方法@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}//在執行前做的操作@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("開始進行公共字段自動填充...");//獲取到當前被攔截的方法上的數據庫操作類型MethodSignature signature = (MethodSignature) joinPoint.getSignature();AutoFill autoFill=signature.getMethod().getAnnotation(AutoFill.class);OperationType operationType=autoFill.value();
//        MemberSignature signature = (MemberSignature) joinPoint.getSignature();
//        AutoFill autoFill=signature.getMothod().getAnnotation(AutoFill.class)//獲取到當前被攔截的方法的參數-實體對象Object[] args=joinPoint.getArgs();if(args==null||args.length==0)return;Object entity=args[0];//準備賦值的類型LocalDateTime now=LocalDateTime.now();Long currentId= BaseContext.getCurrentId();//根據當前不同的操作類型,為對應的屬性通過反射來賦值if(operationType==OperationType.INSERT){try {Method setCreateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME,LocalDateTime.class);Method setCreateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {throw new RuntimeException(e);}}else if(operationType==OperationType.UPDATE){try {Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {throw new RuntimeException(e);}}}
}

首先著重講一下MethodSignature,由于我是跟著視頻操作的,所以我一開始沒有注意到一個很重要的點,MethodSignature到底是否加了extend,但看到這個類都是只讀,我便認為它一開始就加了extend,然后再MethodSignature到Signature之間有這樣一層關系Signature->MemberSignature->CodeSignature->MethodSignature.為什么需要這樣繼承呢,因為Signature沒有getMethod方法,而我們需要獲取方法上的注解類型,故進行這樣一步操作.用于后面操作的條件判斷.

接著在需要公共字段填充的類方法上加上@AutoFill(value="")注解,""里面填寫對應的方法,這里只定義了update和insert.

舉個例子

@Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +" VALUES" +" (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")@AutoFill(value = OperationType.INSERT)void insert(Category category);

內容完

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

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

相關文章

絕地求生:PGS3參賽隊伍跳點一覽,17壓力有點大,4AM與PeRo大概率不roll點

在PCL春季賽結束后&#xff0c;PGS3的參賽隊伍名單以及分組就正式確定了&#xff0c;最后確定名額的DDT和NH被安排在了A組和B組&#xff0c;感覺這次PGS3的分組比較均衡&#xff0c;沒有“死亡之組”一說。這段時間已經有網友匯總了PGS3隊伍在各個地圖的跳點&#xff0c;并且把…

「AIGC算法」近鄰算法原理詳解

本文主要介紹近鄰算法原理及實踐demo。 一、原理 K近鄰算法&#xff08;K-Nearest Neighbors&#xff0c;簡稱KNN&#xff09;是一種基于距離的分類算法&#xff0c;其核心思想是距離越近的樣本點&#xff0c;其類別越有可能相似。以下是KNN算法的原理詳解&#xff1a; 1. 算…

python安裝ESPHome

1. powershell輸入python 或者 python3 可以查看python版本&#xff0c;沒安裝則會自動跳出微軟商店&#xff0c;安裝即可(注意這里會自動安裝在C盤默認路徑) 2. pip3 install esphome -i https://mirrors.aliyun.com/pypi/simple 3. 根據報錯信息找到esphome的安裝目錄&…

python腳本編輯oss文件

1、安裝oss2庫 rootubuntu:~# pip3 install oss2 Collecting oss2Downloading oss2-2.18.5.tar.gz (283 kB)|████████████████████████████████| 283 kB 6.9 MB/s Collecting aliyun-python-sdk-core>2.13.12Downloading aliyun-python-s…

Vmvare—windows中打不開攝像頭

1、檢查本地攝像頭是否能正常打開 設備管理器—查看—顯示隱藏設備—選中照相機—啟動 USB2.0 HD UVC—打開相機查看 2、檢查虛擬機的設置 虛擬機—虛擬機—可移動設備—USB2.0 HD UVC—勾選在狀態欄中顯示 虛擬機—打開windows主機—右小角選中圓圈圖標—勾選連接主機 此時…

Android14音頻進階之ADSP調試(七十二)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優質專欄:Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄:多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+AOSP…

Java | Leetcode Java題解之第91題解碼方法

題目&#xff1a; 題解&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …

小紅書筆記怎么發瀏覽量高?

小紅書筆記發布是有技巧和策略的&#xff0c;為什么有的小紅書筆記瀏覽量那么高&#xff0c;是因為下足了功夫&#xff0c;小紅書筆記怎么發瀏覽量高&#xff1f;今天伯樂網絡傳媒就來給大家揭秘一下。 一、選題與定位 1. 熱門話題選擇 要想提高小紅書筆記的瀏覽量&#xff0…

虛擬化技術 使用vSphere Web Client管理ESXi主機

一、實驗內容 通過vSphere Web Client將ESXi主機連接到iSCSI共享存儲通過vSphere Web Client&#xff0c;使用共享存儲創建虛擬機并安裝windows 2008 R2操作系統通過vSphere Web Client&#xff0c;為虛擬機創建快照 二、、實驗主要儀器設備及材料 安裝有64位Windows操作系統…

Redis如何避免數據丟失?——AOF

目錄 AOF日志 1. 持久化——命令寫入到AOF文件 寫到用戶緩沖區 AOF的觸發入口函數——propagate 具體的實現邏輯——feedAppendOnlyFile 從用戶緩沖區寫入到AOF文件(磁盤&#xff09; 函數write、fsync、fdatasync Redis的線程池 AOF文件的同步策略 觸發的入口函數——…

24.HashMap的擴容機制

ps&#xff1a;沒看太懂源碼&#xff0c;不確定是否正確... 一、擴容條件 當HashMap中元素的總個數超過&#xff08;threshold&#xff09;閾值&#xff08;數組容量乘以負載因子&#xff09;時&#xff0c;會觸發擴容。默認情況下&#xff0c;&#xff08;capacity&#xff0…

JavaScript函數聲明

JS函數聲明 JS中的方法,多稱為函數,函數的聲明語法和JAVA中有較大區別 語法1&#xff1a;function 函數名 (參數列表){函數體} 語法2&#xff1a;var 函數名 function (參數列表){函數體} 函數說明 函數沒有權限控制符不用聲明函數的返回值類型,需要返回在函數體中直接return即…

UBUNTU下指定執行文件運行時查找庫的路徑

在Ubuntu下&#xff0c;當指定執行文件時&#xff0c;程序運行時會查找庫文件。通常情況下&#xff0c;程序會在系統默認的庫文件路徑中查找&#xff0c;例如/lib和/usr/lib。 如果需要程序在執行時查找特定路徑下的庫文件&#xff0c;可以通過以下方法實現&#xff1a; 設置環…

Gone框架介紹18 - redis 分布式緩存 和 分布式鎖

gone是可以高效開發Web服務的Golang依賴注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文檔地址&#xff1a;https://goner.fun/zh/ 請幫忙在github上點個 ??吧&#xff0c;這對我很重要 &#xff1b;萬分感謝&#xff01;&#xff01; 文章目錄 利用redi…

Python | Leetcode Python題解之第92題反轉鏈表II

題目&#xff1a; 題解&#xff1a; class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 設置 dummyNode 是這一類問題的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

云計算第十八課

目錄操作 移動 改名 批量改名&#xff0c;寫腳本 mv [選項] … 源文件或目錄… 目標文件或目錄 單個文件 移動 或者改名 -f&#xff1a;強制覆蓋&#xff0c;如果目標文件已經存在&#xff0c;則不詢問&#xff0c;直接強制覆蓋&#xff1b; -i&#xff1a;交互移動&#x…

零基礎學Java第十四天之抽象類

抽象類和抽象類的深入 抽象類 1、理解 抽象類&#xff08;Abstract Class&#xff09;是面向對象編程中的一個重要概念&#xff0c;尤其在像Java、C#和C等編程語言中。抽象類是一種特殊的類&#xff0c;它不能被實例化&#xff08;即不能創建抽象類的對象&#xff09;&#x…

鼠標懸浮(hover)時顯示提示框的效果

在Vue中&#xff0c;你可以使用多種方法來實現鼠標懸浮&#xff08;hover&#xff09;時顯示提示框的效果。以下是一個簡單的示例&#xff0c;它使用了Vue的指令&#xff08;directive&#xff09;和條件渲染&#xff08;conditional rendering&#xff09;來實現這個功能。 首…

關于FIFO Generator IP和XPM_FIFO在涉及位寬轉換上的區別

在Xilinx FPGA中&#xff0c;要實現FIFO的功能時&#xff0c;大部分時候會使用兩種方法&#xff1a; FIFO Generator IP核XPM_FIFO原語 FIFO Generator IP核的優點是有圖形化界面&#xff0c;配置參數非常直觀&#xff1b;缺點是參數一旦固定&#xff0c;想要更改的化就只能重…

一次tomcat閃退處理

雙擊tomcat目錄下bin目錄中startup.bat 在我的電腦上是一閃而過&#xff0c;不能正常地啟動tomcat軟件 以記事本打開startup.bat文件&#xff0c;在文件的結尾處加上pause 然后再雙擊該bat執行&#xff0c;此時窗口就不會關閉&#xff0c;并會將錯誤信息打印在提示框中 可能是…