pointcut注解_Spring AOP使用指南,詳細了解AOP相關注解

Spring AOP 指導教程

什么是Spring AOP

spring aop可以在spring構建的系統中使用面向切面編程。當然Spring Boot也是基于Spring構建的。使用AOP

可以實現諸如事務,日志以及安全校驗等通過切面統一完成的任務。他可以通過簡單的注解方式實現在方法執行前后來執行你自己的邏輯。

什么是advice, joinpoint和pointcut

  • Joinpoint:程序的執行點,如方法的執行或者異常的處理。
  • Pointcut:一個用來匹配joinpoint的斷言或者表達式。
  • Advice:與一個pointcut關聯,并在匹配點運行。

advices的類型

  • Before advice:在join point之前執行的advice,不能阻止程序的繼續運行。
  • After returning advice:在join point完成之后執行的advice。
  • After throwing advice:在執行的方法拋出異常之后執行。
  • After advice:在執行的join point退出之后執行不論正常退出或者拋出了異常。
  • Around advice:可以在方法調用之前或之后執行自定義行為,并且還可以選擇繼續執行join point或者執行另外的方法。
b82ae2743488ea31487b3849ff5f0fc9.png

Spring AOP 示例

編寫Aspectclass然后寫相應的執行方法并在方法上寫joint-point表達式

面向切面編程首先需要在類上加@Aspect注解表名這是一個AOP管理的類,然后在方法上加上point-cut表達式用來匹配joint-point方法。

@Aspectpublic class EmployeeCRUDAspect {  @Before("execution(* EmployeeManager.getEmployeeById(..))") //point-cut expression public void logBeforeV1(JoinPoint joinPoint) { System.out.println("EmployeeCRUDAspect.logBeforeV1() : " + joinPoint.getSignature().getName()); }}

寫由切面控制的方法(joint points)

首先將類注入到Spring中,之后寫正常的方法即可。

@Componentpublic class EmployeeManager{ public EmployeeDTO getEmployeeById(Integer employeeId) { System.out.println("Method getEmployeeById() called"); return new EmployeeDTO(); }}

在上面的例子中,logBeforeV1方法會在getEmployeeById方法執行之前執行。將會打印如下日志:

EmployeeCRUDAspect.logBeforeV1() : getEmployeeByIdMethod getEmployeeById() called

AOP注解

@Before

在切面控制的方法之前執行。

@Aspectpublic class LoggingAspect {  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logBeforeAllMethods(JoinPoint joinPoint) { ... }  @Before("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logBeforeGetEmployee(JoinPoint joinPoint) { ... }}

logBeforeAllMethods方法會在EmployeeManagerImpl中所有方法執行前執行。

@After

在切面控制的方法之后執行。

@Aspectpublic class LoggingAspect {  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterAllMethods(JoinPoint joinPoint) { ... }  @After("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.getEmployeeById(..))") public void logAfterGetEmployee(JoinPoint joinPoint) { ... }}

@Around

可以在方法執行前后切入。

@Aspectpublic class LoggingAspect {  @Around("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAroundAllMethods(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": Before Method Execution"); try { joinPoint.proceed(); } finally { //Do Something useful, If you have } System.out.println("****LoggingAspect.logAroundAllMethods() : " + joinPoint.getSignature().getName() + ": After Method Execution"); }?}

@AfterReturning

在方法執行完成且沒有拋出任何異常的情況下。

@Aspectpublic class LoggingAspect {  @AfterReturning("execution(* com.howtodoinjava.app.service.impl.EmployeeManagerImpl.*(..))") public void logAfterReturningAllMethods() throws Throwable { System.out.println("****LoggingAspect.logAfterReturningAllMethods() "); }?}

以上示例中只用到了execution方式,還有一種使用@annotation可以對注解了指定接口的方法進行切面編程。這種用法在之前的mybatis多數據源中使用過。

另外還有很多AOP的注解,如果大家感興趣的話,會繼續把剩下的用法寫完~

3bbb10b22420e193df51ddfa389b2e21.png
237e3090d8fde87006007e1c1090771f.png

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

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

相關文章

C# 實現FTP上傳與下載

向FTP服務器下載文件的簡單實例 Codestring filePath "d:\\"; string fileName "lhking.txt"; //文件下載之后要保存的路徑和文件名 FtpWebRequest reqFTP; try { FileStream outputStream …

Linux源碼安裝mysql 5.6.12(cmake編譯)

轉載鏈接:http://www.2cto.com/database/201307/229260.html Linux源碼安裝mysql 5.6.12(cmake編譯)1.安裝make編譯器(默認系統自帶)下載地址:http://www.gnu.org/software/make/[c-sharp] tar zxvf make-3.82.tar.gz cd make-3.…

云棲專輯 | 阿里開發者們的第6個感悟:享受折磨

2015年12月20日,云棲社區上線。2018年12月20日,云棲社區3歲。阿里巴巴常說“晴天修屋頂”。在我們看來,寒冬中,最值得投資的是學習,是增厚的知識儲備。所以社區特別制作了這個專輯——分享給開發者們20個彌足珍貴的成長…

python刪除數據庫的數據完整代碼_利用python操作小程序云數據庫實現簡單的增刪改查...

不止python,你可以利用任何語言那實現通過http請求來操作你自己的小程序云數據庫了背景也是在最近吧,小程序更新了云開發 HTTP API 文檔,提供了小程序外訪問云開發資源的能力,使用 HTTP API 開發者可在已有服務器上訪問云資源&…

AI技術在智能海報設計中的應用

背景 在視覺設計領域中,設計師們往往會因為一些簡單需求付出相當多的時間,比如修改文案內容,設計簡單的海報版式,針對不同機型、展位的多尺寸拓展等。這些工作需要耗費大量的時間、人力成本(5~6張/人日)&am…

javaScript如何監聽瀏覽器關閉事件

轉載鏈接:http://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872596.html 最近寫東西的時候發現需要對瀏覽器的關閉進行監聽,當用戶關閉的時候需要調用session.invalid();清空session信息,但是仔細一查手冊發現無論是body還是window都沒有onclose事件,之后onload…

C++樹的實現

C樹的實現 STL里面沒有提供容器樹的模板實現&#xff0c;自已寫一個&#xff1a;Tree.h //tree.h 頭文件 #include <list> #include <algorithm> using namespace std; struct TreeNode; //定義一個結構體原型 classTree; //定義一個類原型 classIterator; //定義一…

加密文件忘記密碼怎么解密_MyBatis 配置文件 用戶密碼加密存儲

properties配置文件一般是使用properties保存配置文件內容,然后在mybatis配置文件中進行讀取在resource文件下新建db.properties文件內容如下# 數據庫配置文件 driver com.mysql.cj.jdbc.Driver url jdbc:mysql:// /mybatis username password 然后,接著把文件放入源碼包…

PHP,如何防止同一用戶同一時間多次登錄

轉載鏈接&#xff1a;http://blog.sina.com.cn/s/blog_4832ea590101djnp.html PHP&#xff0c;如何防止同一用戶同一時間多次登錄&#xff1f; 創建表 username password sessionId 張三 123456 ksw9dkw9ksl92w3 備注&#xff1a;用戶…

科技前沿智能創新 2019北京智能家居 全屋智能博覽會

2019北京智能家居大型展覽會 2019北京全屋智能家居博覽會報道布展&#xff1a;2019年6月26日-27日 展會開幕&#xff1a;2019年6月28日上午9&#xff1a;00時展會交易&#xff1a;2019年6月28日-30日 展會撤展&#xff1a;2019年6月30日下午14&#xff1a;00時 展覽會在北京市政…

java 容器_我也來聊聊,JAVA容器與迭代器

java的容器與迭代器是一個老生常談的話題了。本文旨在與大家分享一些關于雙向鏈表與迭代器的運用小技巧&#xff0c;并希望本篇文章的內容能夠在項目中給你帶來幫助。Stack與LinkedListStack是一個LIFO(后進先出)的容器。若要在java中定義一個Stack應該怎么辦&#xff1f;也許你…

VS2005調試時變慢解決辦法

vs2005生成代碼以及調試運行時&#xff0c;如果設置斷點系統運行非常緩慢&#xff0c;從網上查閱一些資料后解決&#xff1a; 主要解決辦法是&#xff1a; 打開VS2005菜單項"工具"---->"導入導出設置"----->"重置所有設置" 本文參考:http:…

apache目錄的訪問控制

轉載鏈接&#xff1a;http://blog.sina.com.cn/s/blog_7be8a2150100trml.html 1.根目錄的訪問控制 DocumentRoot "/var/www/html" <Directory /> Options FollowSymLinks AllowOverride None </Directory> 解釋一下&#xff1a; <Dir…

廣東高院駁回快播對深圳市場監管局2.6億罰款案上訴

雷帝網 樂天 12月29日報道據廣東高院官方微信消息&#xff0c;廣東省高級人民法院對深圳市快播科技有限公司&#xff08;簡稱快播&#xff09;訴深圳市市場監督管理局&#xff08;簡稱市場監管局&#xff09;著作權行政處罰糾紛案作出終審宣判&#xff0c;駁回上訴&#xff0c;…

【Vegas原創】恢復Oracle Package的笨方法

imp沒有恢復package的參數&#xff0c;所以&#xff0c;只能用笨辦法&#xff1a;rowsn&#xff0c;只導入表結構和物件。 步驟&#xff1a; 1&#xff0c;dbca新建一個test數據庫&#xff1b; 2&#xff0c;新增user&#xff0c;表空間&#xff0c;給user賦予權限 3&#xff0…

python enumerate函數_關于python中enumerate和zip函數的用法及舉例

關于python中enumerate和zip函數的用法及舉例關于enumerate函數&#xff1a;enumerate函數可以同時返回列表或元組等可迭代對象的下標和內容&#xff0c;但實際上&#xff0c;enumerate函數實際返回的是一個enumerate類型的可迭代對象&#xff0c;下面是用法舉例&#xff1a;se…

php 解析xml 的四種方法(轉)

轉載鏈接&#xff1a;http://www.cnblogs.com/likwo/archive/2011/08/24/2151793.html XML處理是開發過程中經常遇到的&#xff0c;PHP對其也有很豐富的支持&#xff0c;本文只是對其中某幾種解析技術做簡要說明&#xff0c;包括&#xff1a;Xml parser, SimpleXML, XMLReader,…

Golang 微服務系列 go-kit(Log,Metrics,Tracing)

go-kit Log & Metrics & Tracing 微服務監控3大核心 Log & Metrics & Tracing Log Log 模塊源碼有待分析&#xff08;分析完再補上&#xff09; Metrics 主要是封裝 Metrics 接口&#xff0c;及各個 Metrics(Prometheus,InfluxDB,StatsD,expvar) 中間件的封裝。…

GDI+

載解壓GDI開發包&#xff1b; 2&#xff0e; 正確設置include & lib 目錄&#xff1b; 3&#xff0e; stdafx.h 添加&#xff1a; #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include <gdiplus.h> 4&#xff0e; 程序中添加GDI的包含文件gdip…

shell 練習3

1、編寫腳本/root/bin/createuser.sh&#xff0c;實現如下功能&#xff1a;使用一個用戶名做為參數&#xff0c;如果指定參數的用戶存在&#xff0c;就顯示其存在&#xff0c;否則添加之&#xff1b;顯示添加的用戶的id號等信息2、編寫腳本/root/bin/yesorno.sh&#xff0c;提示…