使用注解的AOP編程

使用注解的AOP編程

當注解沒有參數時

當使用注解進行面向切面編程(AOP)時,你可以按照以下步驟來實現:

步驟:

1. 創建自定義注解:

首先,創建自定義的注解,以便在代碼中標記需要進行橫切操作的方法或類。

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {// 定義注解的屬性(可選)
}
2. 創建切面類:

創建一個切面類,在切面類中定義相應的通知(advice),如 @Before@After@Around 等,以及指定切入點表達式來匹配需要執行橫切邏輯的位置。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;@Aspect
@Component
public class MyAspect {@Around("@annotation(com.example.MyCustomAnnotation)")public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 執行目標方法前的邏輯// 可以獲取特定注解的信息,執行額外操作Object result = joinPoint.proceed(); // 執行目標方法// 執行目標方法后的邏輯// 可以處理目標方法執行后的結果或執行其他操作return result;}
}
3. 將切面類注冊為 Spring Bean:

確保切面類被 Spring 容器管理,這樣它才能夠被應用到目標類的方法上。

4. 在目標類或方法上使用自定義注解:
@MyCustomAnnotation
public void myMethod() {// 這個方法會被切面攔截并執行 MyAspect 中定義的 myAdvice 方法的邏輯// 可以在此方法中定義業務邏輯
}
5. 運行程序:

確保 Spring 應用程序能夠正常啟動,并且切面邏輯能夠被成功應用于被標記的方法或類中。

總結:

使用注解的 AOP 編程主要步驟包括:定義自定義注解,創建切面類并編寫相應的通知方法和切入點表達式,將切面類注冊為 Spring Bean,并在需要的目標方法或類上使用自定義注解。這樣,切面類中定義的邏輯就可以在被標記的方法或類執行時生效,實現橫切關注點的操作。

當注解有參數要獲取里面的參數時

當使用注解進行面向切面編程(AOP)時,如果需要操作注解中的參數,可以按照以下步驟進行:

步驟:

1. 創建自定義注解:

首先,創建自定義的注解,并在注解中定義所需的屬性,以便在被標記的方法或類中使用。

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {String value(); // 添加需要的參數
}
2. 創建切面類:

創建一個切面類,在切面類中定義相應的通知(advice),同時通過方法參數獲取注解中的屬性值。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.AnnotationUtils;@Aspect
@Component
public class MyAspect {@Around("@annotation(myAnnotation)") // 通過參數獲取注解public Object myAdvice(ProceedingJoinPoint joinPoint, MyCustomAnnotation myAnnotation) throws Throwable {String annotationValue = myAnnotation.value(); // 獲取注解中的屬性值// 執行目標方法前的邏輯// 可以使用注解中的屬性值執行額外操作Object result = joinPoint.proceed(); // 執行目標方法// 執行目標方法后的邏輯// 可以處理目標方法執行后的結果或執行其他操作return result;}
}

代碼中能夠直接用@Around(“@annotation(myAnnotation)”) 的原因介紹:

在這段代碼中,@Around("@annotation(myAnnotation)") 表達式使用了 AspectJ 的切入點表達式,其中 @annotation() 是用于匹配帶有特定注解的方法的一種方式。這個表達式告訴切面,當被攔截的方法上存在指定的 myAnnotation 注解時,應該執行橫切邏輯。

在這里,@Around 注解中的 @annotation(myAnnotation) 表達式中的 myAnnotation 是作為參數傳入 myAdvice 方法的,表示該方法參數中的特定注解實例。

AspectJ 允許使用 @annotation() 來匹配帶有特定注解的方法。當執行被切入點所匹配的方法時,切面會攔截該方法并執行 myAdvice 方法中定義的邏輯,同時允許通過 joinPoint.proceed() 執行原始方法。

在執行時,AspectJ會檢查被攔截的方法上是否存在 myAnnotation 注解,并在滿足條件時執行 myAdvice 中的邏輯。這樣你可以在方法執行前后做一些額外的操作,例如權限校驗、日志記錄等。

簡單來說就是原來對注解的匹配變成了從方法參數中取這個注解的定義了。

3. 將切面類注冊為 Spring Bean:

確保切面類被 Spring 容器管理,這樣它才能夠被應用到目標類的方法上。

4. 在目標類或方法上使用自定義注解,并傳遞參數:
@MyCustomAnnotation(value = "someValue")
public void myMethod() {// 這個方法會被切面攔截并執行 MyAspect 中定義的 myAdvice 方法的邏輯// 可以在此方法中定義業務邏輯
}

總結:

  1. 定義自定義注解:在注解中添加需要的參數。
  2. 創建切面類:使用 @Around 或其他通知注解,在方法簽名中加入注解類型的參數,通過該參數獲取注解中的屬性值。
  3. 將切面類注冊為 Spring Bean:確保切面類被 Spring 容器管理。
  4. 在目標方法或類上使用自定義注解:使用自定義注解并傳遞所需的參數,這樣切面就能夠獲取并操作注解中的參數信息。

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

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

相關文章

Excel換不了行怎么解決?

方法一: 使用Alt Enter鍵 在Excel中,輸入文字時按下回車鍵,光標將會移到下一個單元格,如果想要換行,可以嘗試使用Alt Enter鍵。具體操作如下: 1.在單元格中輸入文字; 2.想要換行時,在需要換行的位置按下Alt Enter鍵; 3…

延時任務定時發布,基于 Redis 與 DB 實現

目錄 1、什么是延時任務,分別可以使用哪些技術實現? 1.2 使用 Redis 和 DB 相結合的思路圖以及分析 2、實現添加任務、刪除任務、拉取任務 3、實現未來數據的定時更新 4、將數據庫中的任務數據,同步到 Redis 中 1、什么是延時任務&#xff…

網絡運維與網絡安全 學習筆記2023.11.23

網絡運維與網絡安全 學習筆記 第二十四天 今日目標 VRRP負載均衡、BFD原理與配置、BFD典型應用 DHCP工作原理、全局模式DHCP VRRP負載均衡 VRRP單組缺陷 每網段存在一個VRRP組,缺點如下: 主網關數據轉發壓力大 備份網關不轉發任何數據 網絡設備利用…

Hook技術(鉤子技術)

HOOK(鉤子技術) 這里的hook我理解的意思就是通過攔截指令,將指令換成自己想要的指令,從而做道繞過原本的程序指令,要修改這個指令,要用匯編技術,從二進制入手。 擴展: 木馬病毒之…

git clone慢的解決辦法

在網站 https://www.ipaddress.com/ 分別搜索: github.global.ssl.fastly.net github.com 得到ip: 打開hosts文件 sudo vim /etc/hosts 在hosts文件末尾添加 140.82.114.3 github.com 151.101.1.194 github.global-ssl.fastly.net 151.101.65.194 g…

外部網關協議_邊界網關協議BGP

一.邊界網關協議BGP的基本概念 邊界網關協議(Border Gateway Protocol,BGP)屬于外部網關協議EGP這個類別,用于自治系統AS之間的路由選擇協議。由于在不同AS內度量路由的“代價”(距離、帶寬、費用等)可能不同,因此對于…

elasticsearch 7安裝

問題提前報 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的環境是Linux,注意要做以下操作,否則es可能會啟動失敗 1 用編輯工具打開文件/etc/sysctl.conf 2 …

qml渲染引擎介紹

qml項目啟動入口 Qt Quick項目qml腳本在C++代碼里啟動,main.cpp如下: #include <QGuiApplication> #include <QQmlApplicationEngine>int main(int argc, char *argv[]) {

VUE excel表格導出

js代碼 //下載模板 downloadExl() { // 標題 const tHeader [‘xxx’,xxx,xx名稱,電槍xx,協議xx,snxx]; // key const filterVal [agentName, stationName, equName, channelNumber, manufacturer, sn, ]; // 值 const datas [ { agentName: 你好, stationName: 我們, e…

激光雷達與慣導標定 | Lidar_IMU_Init : 編譯

激光雷達與慣導標定&#xff1a;Lidar_IMU_Init 編譯 功能包安裝安裝ceres-solver-2.0.0 &#xff08;注意安裝2.2.0不行&#xff0c;必須要安裝2.0.0&#xff09; LI-Init是一種魯棒、實時的激光雷達慣性系統初始化方法。該方法可校準激光雷達與IMU之間的時間偏移量和外部參數…

unity shaderGraph實例-可交互瀑布

不要問我水在哪里&#xff0c;你自己相像這是一個瀑布&#xff0c;瀑布的效果我還不會做 效果展示 整體結構 這里片元著色器最后輸出的baseColor應該是黑色&#xff0c;白色為錯誤。 各區域內容 區域1 計算球到瀑布的距離&#xff0c;然后減去一個值&#xff0c;實現黑色區域…

UNETR:用于三維醫學圖像分割的Transformer

論文鏈接&#xff1a;https://arxiv.org/abs/2103.10504 代碼鏈接&#xff1a; https://monai.io/research/unetr 機構&#xff1a;Vanderbilt University, NVIDIA 最近琢磨不出來怎么把3d體數據和文本在cnn中融合&#xff0c;因為確實存在在2d里面用的transformer用在3d里面…

wpf使用CefSharp.OffScreen模擬網頁登錄,并獲取身份cookie,C#后臺執行js

目錄 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取邏輯模擬登錄攔截請求Cookie獲取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

API自動化測試:如何構建高效的測試流程

一、引言 在當前的軟件開發環境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了極為重要的角色&#xff0c;連接著應用的各個部分。對API進行自動化測試能夠提高測試效率&#xff0c;降低錯誤&#xff0c;確保軟件產品的質量。本文將通過實…

SpringMVC(三)

十、攔截器 1、攔截器的配置 SpringMVC中的攔截器用于攔截控制器方法的執行 SpringMVC中的攔截器需要實現HandlerInterceptor SpringMVC的攔截器必須在SpringMVC的配置文件中進行配置&#xff1a; <bean class"com.atguigu.interceptor.FirstInterceptor">…

constexpt

constexpt constexpt是C11引入的新的關鍵字&#xff0c;它用于在編譯時而非運行時計算函數或變量的值。這個特性對于提高程序效率和優化代非常有用。 編譯時常量和運行時常量 編譯時常量&#xff08;Compile-time Constants&#xff09;和運行時常量&#xff08;Runtime Con…

8年經驗之談 —— 如何使用自動化工具編寫測試用例?

以下為作者觀點&#xff0c;僅供參考&#xff1a; 在快速變化的軟件開發領域&#xff0c;保證應用程序的可靠性和質量至關重要。隨著應用程序復雜性和規模的不斷增加&#xff0c;僅手動測試無法滿足行業需求。 這就是測試自動化發揮作用的地方&#xff0c;它使軟件測試人員能…

leetcode做題筆記1410. HTML 實體解析器

「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們對應的字符實體包括&#xff1a; 雙引號&#xff1a;字符實體為 &quot; &#xff0c;對應的字符是 "…

python appium 官網下載

找了半天吐了 https://github.com/appium/appium-desktop/releases/tag/v1.22.3-4

Hibernate批量處理數據

概念&#xff1a; 批量處理數據是指在一個事務場景中處理大量數據。 在應用程序中難以避免進行批量操作&#xff0c;Hibernate提供了以下方式進行批量處理數據&#xff1a; (1)使用HQL進行批量操作 數據庫層面 executeUpdate() (2)使用JDBC API進行批量操作 數據庫層面 …