使用AspectJ註解技術實現AOP功能

2020-11-29 米粒教育

AspectJ是一個面向切面編程的框架,使用AspectJ不需要改動Spring配置文件,就可以實現Spring AOP功能。本篇結合實際案例詳細講述使用AspectJ實現AOP功能。通過本篇的學習,可以解決如下問題。

● 使用AspectJ技術的背景是什麼?

● 在不修改原有業務代碼的情況下,如何設置業務攔截點?

1、 使用AspectJ技術的背景

在使用AspectJ之前,需要確定項目已經引入了AspectJ相關Jar包,並且AspectJ的版本要兼容JDK、Spring框架的版本,使用不兼容的版本會導致程序報錯。

課程案例SpringProgram項目使用的JDK版本是1.8,Spring框架版本是5.08。需要引入的AspectJ相關Jar包如下所示。

● aspectj-1.8.9

● aspectjweaver-1.8.9

關於AOP實現原理在《詳解Spring框架的AOP機制》一文中已經詳細描述,這裡不再贅述。不過本文的AOP項目案例還是借鑑《詳解Spring框架的AOP機制》一文中的案例。因為Spring框架提供了AspectJ 註解方法和基於XML架構的方法來實現AOP,在《詳解Spring框架的AOP機制》中,重點介紹了基於XML架構的方法來實現AOP,本文將重點介紹利用AspectJ 註解方法實現AOP。用同一個案例採用兩種不同的實現方法,既可以加深對AOP的理解,也可以對兩種實現技術進行對比,可以選擇適合自己的一種技術來實現AOP。

在課程案例SpringProgram項目中,一個業務流程是校長通過郵件發送上課通知給老師。校長執行該業務時,業務系統並沒有對老師進行驗證。現在要求校長在發送通知之前,需要對老師進行用戶驗證。

具體要求是在儘量不改變原有業務代碼的情況下,加入老師驗證功能。原有業務代碼如下。

分析上面的業務代碼,可以考慮在執行setTeacher之前加入老師的驗證方法,並將老師對象teacherZhang作為參數傳給驗證方法。如果能夠修改業務代碼,可以直接在setTeacher方法之前加入VerifyTeacher驗證方法。

由於各種原因,不允許修改原有的業務代碼。在這種情況下,可以採用AOP技術,攔截setTeacher方法,在setTeacher方法執行之前、執行之後、拋出異常之後執行攔截方法。攔截方法所在類的稱為切面,攔截方法稱為切入點。如下圖所示。

圖 1 使用AOP攔截setTeacher方法

2、使用Aspectj攔截setTeacher方法

AspectVerifyUser類用於驗證老師身份,如果不加Aspecj註解,AspectVerifyUser類只是一個普通的Java類,不能被AOP調度使用。要使AspectVerifyUser類作為切面使用並攔截setTeacher方法,實現執行setTeacher方法之前先執行VerifyTeacher方法,在setTeacher方法執行成功後,再執行AfterSetTeacher方法。就需要在AspectVerifyUser類中添加Aspecj註解。

添加@Aspect註解

在類頭部加@Aspect註解,使AspectVerifyUser類成為切面類,並被AOP識別和加載。作用類似於在Spring配置文件中的AOP標籤<aop:config>。

添加 @Pointcut註解

在類方法頭部加@Pointcut註解,使該方法稱為一個切入點。@Pointcut註解的execution表達式定義該方法在什麼位置切入。

例如:

@Pointcut註解指示AOP將VerifyUser()方法作為切入點,切入到AopEmailNotice類的setTeacher位置,傳入的參數為任意類型和數量,VerifyUser()為空函數,實際執行的函數通過@Before、@After、@Around等註解與VerifyUser()方法關聯。

再如:

@Pointcut註解指示AOP將VerifyUser()方法作為切入點,切入到com.milihua.springprogram.notice包及子包下所有的類及類中所有的方法。

又如:

@Pointcut註解指示AOP將VerifyUser()方法作為切入點,切入到com.milihua.springprogram.notice包下所有的類及類中所有的方法。

添加 @{ADVICE-NAME}註解

@{ADVICE-NAME}為聲明建議註解,也可以稱之為通知註解。該註解添加到實際執行函數的頭部,並與切入點的名稱進行關聯。

@{ADVICE-NAME}有五種註解,分別是@Before、@After、@Around、@AfterReturning、@AfterThrowing。被@Before註解的方法在被切入方法執行之前執行;被@After註解的方法在被切入方法執行之後執行,不考慮是否執行成功;被@AfterReturning註解的方法在被切入方法執行成功之後執行,當被切入方法發生異常時,該方法不被執行;被@Around註解的方法在被切入方法執行之前和執行之後都執行;被@AfterThrowing註解的方法,只有當被切入方法執行過程發生異常時才會執行。

例如:

VerifyTeacher方法頭部被@Before("VerifyUser()")註解,該方法在被切入的setTeacher方法之前執行。

獲取通知參數

切入方法如何獲取被切入方法傳遞過來的參數呢?例如,AspectVerifyUser類的VerifyTeacher方法切入到AopEmailNotice類的setTeacher方法,VerifyTeacher需要獲取setTeacher方法的AopTeacher類參數,用於對老師進行用戶驗證。

AOP使用org.aspectj.lang.JoinPoint類型,用於獲取被切入點傳入的參數,任何切入方法的第一個參數都可以是JoinPoint。JoinPoint結構如下。

其中,getArgs方法可以獲取被切入點方法參數列表,根據參數列表可以獲取傳入的參數。

在課程案例SpringProgram項目中,添加aspec.xml,配置AspectVerifyUser類。

在課程案例SpringProgram項目中,添加測試類。

課程小結

(1)本篇探討了使用AspectJ技術的背景。當原有業務流程需要添加事務處理、安全控制、性能統計、異常處理等功能時,可以使用AspectJ技術在不修改原有業務代碼的情況下,將上述功能切入到業務流程中;在構建新的系統時,也可以將上述功能獨立考慮,再通過AspectJ技術將它們集成到系統中。

(2)本篇也通過案例講述了應用AspectJ技術實現AOP的過程,具體實現步驟是:首先編寫需要切入業務流程的獨立模塊(也稱為切面)和切入點(模塊中的方法),並添加AspectJ相關註解,確定切入的位置;然後在Spring配置文件中配置新添加的切面Bean,無需配置AOP信息;最後編寫測試代碼。

相關焦點

  • Spring Boot 示例的@RestController 和 @RequestMapping註解
    在示例原始碼類中的第一個註解(annotation)是 @RestController。這個註解被稱為 stereotype 註解。在使用 Spring 的時候,需要對註解有所了解。不僅僅是 @Component,他的派生註解 @Service、@Controller、@RestController 和 @Repository都在這個包中,實際上它就是在告訴使用者這些註解提供 stereotype 的特性(或者稱為功能、作用)。Stereotype 特性最早出現在J2EE6 中,可以理解為圍繞著 「元數據」 功能而發展出來的一種設計模式。
  • Transformer註解及PyTorch實現(上)
    雖然原文寫得很清楚,但實際上大家普遍反映很難正確地實現。所以我們為此文章寫了篇註解文檔,並給出了一行行實現的Transformer的代碼。本文檔刪除了原文的一些章節並進行了重新排序,並在整個文章中加入了相應的註解。此外,本文檔以Jupyter notebook的形式完成,本身就是直接可以運行的代碼實現,總共有400行庫代碼,在4個GPU上每秒可以處理27,000個tokens。
  • smart-doc 1.9.7 發布,Java 零註解文檔生成工具
    smart-doc是一款同時支持java restful api和apache dubbo rpc接口文檔生成的工具,smart-doc顛覆了傳統類似swagger這種大量採用註解侵入來生成文檔的實現方法
  • SpringBoot開發自己的@Enable功能
    @Enable*是springboot中用來啟用某一個功能特性的一類註解。隨便打開幾個@Enable*的源碼,比如@EnableSync,@EnableCircuitBreaker, @EnableCache這些類中都有共同點使用了@Import註解@Import 這個類的注釋是這麼說的:Indicates one or more component classes to import — typically @Configuration
  • 首個帶註解的納米科學SEM圖像庫
    實際上,許多研究領域幾乎完全依賴於開放獲取且管理完備的全球共享資料庫,這些功能目前大多由數據存儲平臺實現,因而數據存儲平臺已成為科學研究基礎設施的重要組成部分。在此背景下,致力於歐洲納米科學研究的NFFA-EUROPE項目將設計歐洲範圍內有效的納米級數據共享方法確立為其主要任務之一。
  • Java @FunctionalInterface註解
    函數式接口就是為 Java 8 的 Lambda 表達式準備的,Java 8 允許使用 Lambda 表達式創建函數式接口的實例,因此 Java 8 專門增加了 @FunctionalInterface。例如,如下程序使用 @FunctionalInterface 修飾了函數式接口。
  • 新能源乘用車車型積分計算方法註解及體會總結
    (註:以上三種車型共同特點是電驅動的,所謂電動驅動,即是電動機驅動汽車運動的,其他車載動力源,不參加驅動汽車運動;插電式混合動力、燃料電池車也必須電動驅動,但是還有其他動力能源)2)《積分辦法》三種車的標準車積分分配新能源乘用車車型積分計算方法註解及體會總結">3)《積分辦法》三種車型參加積分技術的條件
  • 一個註解搞定
    本文主要介紹 同域 和 跨域 兩種不同場景單點登錄的實現原理,並使用 Spring Security 來實現一個最簡單的跨域SSO客戶端 。二、原理說明單點登錄主流都是基於共享 cookie 來實現的,下面分別介紹 同域 和 跨域 下的兩種場景具體怎樣實現共享 cookie 的2.1.
  • Java面試高頻考點:手寫Spring IOC實現機制
    我們重點研究一下如何自己實現一個最簡單的Spring IOC。目前注入Bean的方式有兩種,一種是通過編寫XML文件注入,另一種是通過註解注入。兩種方式的核心原理一致,不同的是XML文件注入是解析文件獲取bean及其依賴關係,註解注入採用的掃描包路徑下的類,注入使用了某些註解的類。因註解注入目前使用的較多,所以本次實踐採用註解注入bean。
  • 如何使用伺服電機實現定位功能?
    今天我們來具體說說如何使用伺服電機實現定位功能。 首先我們需要設置伺服驅動器的控制模式為位置模式,採用脈衝+方向的輸入形式進行控制,配合三菱PLC的運動控制指令可實現完美的定位功能
  • 微型投影儀十年技術發展實現十個功能創新
    比較有代表性的美高G20Pro微型投影儀內置電子白板模塊,融合多項技術、功能創新方面實現了十個功能創新。一、實現投影畫面書寫功能通常的微型投影儀投出大屏畫面,用於大屏影視娛樂,商務會議等。美高G20Pro微型投影儀不僅可以投出百寸大屏,而且可以使用專用筆在畫面書寫、標註、塗鴉、繪畫。
  • 智慧型手機怎樣實現AR技術?哪些手機有AR功能?
    智慧型手機怎樣實現AR技術?哪些手機有AR功能? 單說AR技術也許有些人會覺得陌生,但AR技術已經融入了我們的生活中。相信經常使用百度地圖的用戶已經發現,AR實景導航已經加入地圖中,開啟後透過後置攝像頭可以在實時場景中指出路線,對於廣大路痴來說,可以說是拯救級別的必備工具。
  • 高中生手繪心臟圖用英文註解 醫學院大學生看完都驚呆了
    這份生物作業將心臟畫得萌萌噠,像個紅心寶寶,最讓人驚呼的是註解全是英文,就連醫科大學在校生也感嘆:「上面的一些英文註解還真是看不懂。」24日,上遊新聞-重慶晨報記者從學校了解到,這份手繪心臟圖出自一個17歲的女孩方予之手。小方是高二學生,她謙虛地告訴記者,這是老師布置的寒假作業,「讓我們將上學期學過的重要知識點梳理一下。」
  • Current Opinion in Structural Biology:從蛋白質序列到功能的預測
    2015年5月8日訊/生物谷BIOON/ --隨著測序技術的飛速發展,大量的基因被揭示,大量的蛋白質序列也得到了解析。然而,這些序列信息還沒有被很好的註解。例如,只有不到1%的蛋白質序列有已知的功能。如果我們能夠利用計算生物學的方法,大量註解這些序列信息,就能夠積累很多對於蛋白質結構的認識,最終達到從量變到質變的飛躍。來自美國紐約霍華德醫學中心的科學家們討論了基於蛋白質功能注釋結構的新方法。
  • 一日一技:為什麼不建議使用 time.sleep 實現定時功能?
    有時候,我們想實現一個非常簡單的定時功能,例如讓一個程序每天早上8點調用某個函數。
  • 解析防火牆負載均衡技術與功能實現原理
    防火牆負載均衡技術  概述  網絡安全性是許多ICP和ISP長期擔心的問題,網絡安全已經成為了人們關注的焦點?網絡安全技術將防火牆作為一種防止對網絡資源進行非授權訪問的常用方法?  儘管目前防火牆產品可以有效地防止網絡入侵?但是,它本身也給ICP和ISP網絡帶來了問題?
  • 掃描二維碼,就能實現經編機的生產管理和在線服務!「卡爾邁耶連線...
    掃描二維碼,就能實現經編機的生產管理和在線服務!
  • 中觀學派|龍樹菩薩等「八大註解家」 與《中論》的思想論證!
    事實上,菩薩在《中論》裡,使用的語詞基本上是從《阿含經》來的,並明白說出其所援引的經典是《迦旃延經》。故此,有學者對於「龍樹菩蕯是大乘論師」的說法,採取保留的態度。如印順導師在《中觀今論》中表示:「《中論》是《阿含經》的通論,是通論《阿含經》的根本思想,抉擇《阿含經》的本意所在。」
  • Python學習筆記:日期圖表的詳細設置,圖例和註解及坐標軸移動
    1.日期圖表的詳細設置#導入繪製日期相關圖表時所需要的模塊from pylab import *#導入matplotlib,並簡化,方便調用import matplotlib as mpl#使用datetime模塊,刻度格式器規定了值的顯示方式import datetime#生成圖紙,並設置圖紙的大小尺寸fig=figure(figsize=(10,6))#獲取當前坐標軸
  • Unity3D遊戲語音功能如何實現
    Unity3D是美國Unity Technologies公司開發的一個全面整合的專業遊戲引擎,像我們日常所熟知的《王者榮耀》、《絕地求生》等遊戲都是應用它來開發的,它可以廣泛應用於手遊、網遊、單機以及新的VR遊戲等開發領域,那它的遊戲語音功能是如何實現的?