springboot切面編程

SpringBoot切面編程

眾所周知,spring最核心的兩個功能是aop和ioc,即面向切面和控制反轉。本文會講一講SpringBoot如何使用AOP實現面向切面的過程原理。

何為AOP

AOP(Aspect OrientedProgramming):面向切面編程,面向切面編程(也叫面向方面編程),是目前軟件開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

利用AOP可以對我們邊緣業務進行隔離,降低無關業務邏輯耦合性。提高程序的可重用性,同時提高了開發的效率。一般用于日志記錄,性能統計,安全控制,權限管理,事務處理,異常處理,資源池管理。使用場景

AOP的一些核心概念

概念定義作用示例
橫切關注點多個模塊中共同涉及的功能,如日志、事務、權限等分離通用功能,避免代碼冗余所有Service方法都需要記錄執行時間
切面(Aspect)封裝橫切關注點的模塊,包含切入點和通知將橫切邏輯集中管理定義一個日志切面,統一處理日志記錄
連接點(Join Point)程序執行中的特定點,如方法調用、字段修改等作為切面織入的候選位置某個Service方法被調用時
切入點(Pointcut)定義切面作用的具體位置,通過表達式匹配連接點精確控制切面影響的范圍匹配所有以save開頭的方法
通知(Advice)切面在連接點執行的操作,分為前置、后置、返回、異常、環繞通知實現具體的橫切功能在方法執行前記錄參數,執行后記錄返回值
織入(Weaving)將切面與目標對象連接并創建代理對象的過程使切面邏輯在特定時機生效編譯時織入(AspectJ)、運行時織入(Spring AOP)
目標對象(Target)被切面包裹的對象被增強的原始業務對象實際的UserService類
代理對象(Proxy)織入切面后生成的對象替代原始對象,執行時包含切面邏輯通過JDK動態代理生成的UserService代理對象

代碼實現

這段代碼展示了AOP(面向切面編程)在權限校驗場景中的典型應用。通過自定義注解和環繞通知,實現了方法級別的權限攔截,避免了在每個業務方法中重復編寫權限校驗邏輯。

1. 自定義注解 @AuthCheck
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {String mustRole() default "";
}
  • 作用:標記需要進行權限校驗的方法,并指定所需的角色(如@AuthCheck(mustRole = "ADMIN"))。
  • 元注解
    • @Target(ElementType.METHOD):注解僅可用于方法。
    • @Retention(RetentionPolicy.RUNTIME):注解在運行時保留,以便反射獲取。
2. 切面類 AuthInterceptor
@Aspect
@Component
public class AuthInterceptor {@Resourceprivate UserService userService;@Around("@annotation(authCheck)")public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {// 1. 獲取注解中指定的必須角色String mustRole = authCheck.mustRole();// 2. 獲取當前登錄用戶HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();User loginUser = userService.getLoginUser(request);// 3. 權限校驗邏輯UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);if (mustRoleEnum == null) return joinPoint.proceed(); // 無需權限,放行UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());if (userRoleEnum == null) throw new BusinessException(ErrorCode.NO_AUTH_ERROR);// 管理員權限校驗if (mustRoleEnum == UserRoleEnum.ADMIN && userRoleEnum != UserRoleEnum.ADMIN) {throw new BusinessException(ErrorCode.NO_AUTH_ERROR);}// 校驗通過,執行原方法return joinPoint.proceed();}
}
  • 關鍵元素
    • @Aspect:聲明該類為切面。
    • @Component:將切面注冊為Spring Bean。
    • @Around("@annotation(authCheck)")
      • 環繞通知,攔截所有標記了@AuthCheck注解的方法。
      • authCheck參數綁定當前方法上的@AuthCheck注解實例。

AOP思想的體現

1. 關注點分離
  • 業務邏輯(如用戶服務)與權限校驗完全解耦。
  • 權限校驗邏輯集中在切面中,無需在每個業務方法中重復編寫。
2. 聲明式編程
  • 通過@AuthCheck注解在方法上聲明所需權限,簡潔直觀。
  • 示例:
    @AuthCheck(mustRole = "ADMIN")
    public void deleteUser(Long userId) {// 業務邏輯(無需關心權限校驗)
    }
    
3. 動態代理機制
  • Spring AOP通過動態代理(JDK或CGLIB)在運行時生成代理對象。
  • 代理對象在調用目標方法前后插入權限校驗邏輯:
    調用代理方法 → 執行前置校驗 → 執行目標方法 → 執行后置邏輯
    

執行流程

  1. 方法調用:客戶端調用標記了@AuthCheck的方法。
  2. 代理攔截:Spring AOP攔截調用,執行AuthInterceptor的環繞通知。
  3. 權限校驗
    • 從注解獲取所需角色(如ADMIN)。
    • 從當前請求獲取登錄用戶信息。
    • 比較用戶角色與注解要求的角色。
  4. 結果處理
    • 校驗通過:執行原方法。
    • 校驗失敗:拋出BusinessException

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

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

相關文章

【Redis#4】Redis 數據結構 -- String類型

一、前言 1. 基本概念 理解:字符串對象是 Redis 中最基本的數據類型,也是我們工作中最常用的數據類型。redis中的鍵都是字符串對象,而且其他幾種數據結構都是在字符串對象基礎上構建的。字符串對象的值實際可以是字符串、數字、甚至是二進制&#xff0…

Spring Boot 集成 Dufs 通過 WebDAV 實現文件管理

Spring Boot 集成 Dufs 通過 WebDAV 實現文件管理 引言 在現代應用開發中,文件存儲和管理是一個常見需求。Dufs 是一個輕量級的文件服務器,支持 WebDAV 協議,可以方便地集成到 Spring Boot 應用中。本文將詳細介紹如何使用 WebDAV 協議在 Sp…

Unity打包時編碼錯誤解決方案:NotSupportedException Encoding 437

問題描述 在Unity項目開發過程中,經常會遇到這樣的情況:項目在編輯器模式下運行完全正常,但是打包后運行時卻出現以下錯誤: NotSupportedException: Encoding 437 data could not be found. Make sure you have correct interna…

Spring Bean的生命周期與作用域詳解

一、Spring Bean的生命周期 Spring Bean的生命周期指的是Bean從創建到銷毀的整個過程。理解這個生命周期對于正確使用Spring框架至關重要,它可以幫助我們在適當的時機執行自定義邏輯。 1. 完整的Bean生命周期階段 Spring Bean的生命周期可以分為以下幾個主要階段…

如何將Excel表的內容轉化為json格式呢?

文章目錄 一、前言二、具體操作步驟 一、前言 先說一下我使用Excel表的內容轉為json的應用場景,我們是用來處理國際化的時候用到的。 二、具體操作步驟 第一步:選擇要轉化Excel表的內容(必須是key,value形式的) 第二…

內存堆棧管理(Linux)

以問題形式講解 1.每一個進程都有一個堆空間嗎?還是多個進程共用一個堆空間? 在操作系統中,??每個進程都有自己獨立的虛擬地址空間,其中包括自己獨占的堆空間。堆空間是進程私有的,不與其他進程共享。 進程之間的內…

ThreatLabz 2025 年人工智能安全報告

AI 應用趨勢:爆發式增長與風險并存 2024 年,全球企業的 AI/ML 工具使用量呈指數級增長。Zscaler 云平臺數據顯示,2024 年 2 月至 12 月期間,AI/ML 交易總量達 5365 億次,同比激增 3464.6%,涉及 800 多個應…

【Oracle學習筆記】7.存儲過程(Stored Procedure)

Oracle中的存儲過程是一組為了完成特定功能而預先編譯并存儲在數據庫中的SQL語句和PL/SQL代碼塊。它可以接受參數、執行操作(如查詢、插入、更新、刪除數據等),并返回結果。以下從多個方面詳細講解: 1. 存儲過程的創建 創建存儲過…

tc工具-corrupt 比 delay/loss 更影響性能

1. netem corrupt 5% 的作用 功能說明 corrupt 5% 表示 隨機修改 5% 的數據包內容(如翻轉比特位),模擬數據損壞。它本身不會直接丟棄或延遲數據包,而是讓接收端收到錯誤的數據(可能觸發校驗和失敗、協議層重傳等&…

Flask YAML管理工具

項目概述 項目地址:https://github.com/KaiqiZing/Flask_Yaml_Demo 這是一個基于Flask開發的YAML文件管理工具,提供了完整的YAML文件查看、編輯、管理功能,具有現代化的Web界面和強大的編輯能力。 核心功能 1. 文件管理功能 目錄掃描&am…

Embedding模型微調實戰(ms-swift框架)

目錄 簡介 1. 創建虛擬環境 2 安裝ms-swift 3安裝其他依賴庫 4. 下載數據集 5.開始embedding模型訓練 6. 自定義數據格式和對應的Loss類型 (1) infoNCE損失 (2)余弦相似度損失 (3)對比學習損失 (4).在線對比學習損失 &#…

從性能優化賽到社區Committer,走進趙宇捷在Apache Fory的成長之路

Apache Fory 是一個基于JIT和零拷貝的高性能多語言序列化框架,實現了高效緊湊的序列化協議,提供極致的性能、壓縮率和易用性。在多語言序列化框架技術領域取得了重大突破,推動序列化技術步入高性能易用新篇章!這一切,都…

Python實例題:基于 Flask 的任務管理系統

目錄 Python實例題 題目 要求: 解題思路: 代碼實現: Python實例題 題目 基于 Flask 的任務管理系統 要求: 使用 Flask 框架構建一個任務管理系統,支持以下功能: 用戶認證(注冊、登錄、…

利用GPU加速TensorFlow

一、寫在前面 我們已經依靠keras和TensorFlow給大家做了一些機器學習在圖像處理中的應用(影像組學學習手冊,基于深度學習的圖像分類任務),此前的教程中我們沒有用GPU進行加速,但是相較于CPU而言,GPU是設計用于處理大規模并行計算任務的硬件&…

模型預測專題:強魯棒性DPCC

0 1 前言 在進行DPCC的學習過程中,于下面鏈接看到了一篇強魯棒性算法;感覺挺有意思的,學習一下。 永磁同步電機高性能控制算法(12)——基于預測電流誤差補償的強魯棒預測控制/參數辨識&有限集預測控制與連續集預…

修復opensuse 風滾草rabbitmq的Error: :plugins_dir_does_not_exist問題

https://wiki.archlinux.org/title/Talk:RabbitMQ 報錯 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地圖有哪些庫

以下是前端開發GIS地圖常用的庫&#xff1a; Leaflet&#xff1a;輕量級、易于使用的開源JavaScript庫&#xff0c;具有豐富的地圖功能和插件生態系統&#xff0c;支持多種地圖數據源&#xff0c;適合初學者和專業開發者。其優勢在于簡潔性和易用性&#xff0c;代碼結構清晰&am…

賦能城市安全韌性|眾智鴻圖總裁扈震受邀出席智慧城市大會發表主題報告

——“眾智鴻圖作為城市基礎設施智能化綜合服務提供商&#xff0c;以地理信息科學、時空大數據、人工智能為核心能力&#xff0c;長期深耕于燃氣、供水、排水等城市基礎設施生命線領域及港口、園區等工業領域&#xff0c;致力于為城市穩定運行與高效發展提供堅實保障。” 2025年…

【大語言模型入門】—— 淺析LLM基座—Transformer原理

【大語言模型入門】—— 淺析LLM基座—Transformer原理 解密GPT核心技術&#xff1a;Transformer架構深度解析被反復強調的核心概念意味著什么&#xff1f; GPT預測機制解析&#xff1a;從Next Token Prediction到任務推理核心機制的本質案例驅動的機制解析解構策略&#xff1a…

Django打造智能Web機器人控制平臺

Django 實現 Web 機器人控制 以下是關于 Django 實現 Web 機器人控制管理的實例思路和關鍵代碼片段,涵蓋多個常見場景。由于篇幅限制,剩余的可通過類似模式擴展。 基礎機器人模型定義 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…