Spring學習筆記之AOP配置篇(一)

来源:http://www.cnblogs.com/yilixia/archive/2017/08/10/7340853.html
-Advertisement-
Play Games

[TOC] 1. 創建並聲明一個切麵 1. 首先,創建一個類,添加 註解使其添加到IoC容器 2. 然後,添加 註解,使其成為一個切麵 3. 最後,在配置文件裡面,使用``來使其生效 2. 使用切麵的通知 切麵總共有 6 個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知 ...


[TOC]

1. 創建並聲明一個切麵

  1. 首先,創建一個類,添加@Component註解使其添加到IoC容器
  2. 然後,添加@Aspect註解,使其成為一個切麵
  3. 最後,在配置文件裡面,使用<aop:aspectj-autoproxy></aop:aspectj-autoproxy>來使其生效

2. 使用切麵的通知

切麵總共有6個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知,一個不常用的為:引入通知。

而在五個常用的通知里,環繞通知功能最為強大,可以實現前四個的功能。

  • 前置通知
  • 添加@Before並指定註解參數:@Before(value = "execution(permission returnType packageName.className.methodName(parameters))")
  • 函數參數為: JoinPoint

  • 後置通知
  • 添加@After並指定註解參數:@After(value = "execution(permission returnType packageName.className.methodName(parameters))")
  • 函數參數為: JoinPoint
  • 返回通知
  • 添加@AfterReturning並指定註解參數:@AfterReturning(value = "execution(permission returnType packageName.className.methodName(parameters))",returning="result")
  • 函數參數為: JoinPoint, Object
  • 異常通知
  • 添加@AfterThrowing並指定註解參數:@AfterThrowing(value = "execution(permission returnType packageName.className.methodName(parameters))")
  • 函數參數為: JoinPoint

  • 環繞通知
  • 添加@Around並指定註解參數:@Around(value = "execution(permission returnType packageName.className.methodName(parameters))")
  • 函數參數為: ProceedingJoinPoint
  • 函數返回值為:Object

首先,上面代碼中的名詞為:

  • permission為訪問許可權
  • retrunType為返回值類型
  • packageName為目標(切入對象)的包限定名
  • className為目標的類名
  • methodName為橫切關註點(關註函數)的名字
  • parameters為關註點傳入的參數(只寫類型即可)

其次,上面的註解都有一個隱藏的參數argNames,此參數可確定傳入參數的順序

3. 定義切麵的優先順序

當一個橫切關註點有多個切麵時,我們可能會需要明確切麵的執行順序,此時我們就需要@Order註解來完成這個工作。

  1. 首先,明確我們的切麵執行順序
  2. 然後,在切麵的類註解上添加@Order註解
  3. 最後,為@Order註解指明參數,比如@Order(1)

註意:參數越小,優先順序越高

4. 使用切入點表達式

可能在某種需求下,我們需要為一個關註點織入多個切麵、多種通知,那麼此時按照上面的做法,為每一個通知函數指定execution會顯得很麻煩,這個時候我們就會用到切入點表達式了。切入點表達式看上去就是一個加了註解的方法,使用時調用該方法就是了。

使用切入點表達式需要按照以下步驟:

  1. 選擇本類或者新建一個專門的切麵配置類來容納切入點表達式
  2. 聲明一個方法比如為public void cut(){},添加@Pointcut註解
  3. 像普通的那樣為其指明參數@Pointcut(value = "execution(permission returnType packageName.className.methodName(parameters))")
  4. 在本類中使用,則在原來通知的value屬性上指定該函數即可,比如@Before(value = "cut()")
  5. 在其他類中使用,則需要在方法名前加上該方法的所屬類名,比如@Before(value = "className.cut()")

所以,推薦在切麵所在包下創建一個切麵配置類,而不是所有包共用一個配置類。

需要註意的是,@Pointcut註解沒有returning參數,故不能帶返回值


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • I'm changing the background color based on the data but it makes my text hard to read so I need to change the font color (to white if I have a darker ...
  • 案例1: 演示FileInputStream類的使用(用FileInputStream的對象把文件讀入到記憶體) 首先要在E盤新建一個文本文件,命名為test.txt,輸入若幹字元 運行程式,控制台輸出test.txt中輸入的字元。 案例2: 演示FileOutputStream的使用(把輸入的字元串 ...
  • 題目描述 經過千辛萬苦小 A 得到了一塊切糕,切糕的形狀是長方體,小 A 打算攔腰將切糕切成兩半分給小 B。出於美觀考慮,小 A 希望切麵能儘量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。 出於簡便考慮,我們將切糕視作一個長 P、寬 Q、高 R 的長方體點陣。我們將位於第 z層中第 x ...
  • 在JVM中類載入過程中,在解析階段,Java虛擬機會把類的二級制數據中的符號引用替換為直接引用。 1.符號引用(Symbolic References): 符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能夠無歧義的定位到目標即可。例如,在Class文件中它以CONSTA ...
  • 題目鏈接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , and the radius is r.P and Q are two points not out ...
  • Description 高一一班的座位表是個n*m的矩陣,經過一個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為電腦競賽教練的scp大老闆,想知道如何分 ...
  • 關於GIT GIT 是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。是目前世界上最先進的分散式版本控制系統. 什麼是版本控制 版本控制(Revision control)是維護工程藍圖的標準 ...
  • 一切皆對象! 預習: #仿照正方形類寫一個圓形類 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): '面積' return self.leng ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...