Spring實現AOP原始碼分析
阿新 • • 發佈:2019-01-04
Aop又叫面向切面程式設計,它的作用就是管理分散在整個應用中的變動。這句話理解起來有點抽象,舉個例子,比如我想在多個方法中加一些列印日誌,看下這些方法耗時如何,這些日誌資訊就是程式中的變動,而且是分散在各個不同的方法中的。如果我一個一個方法中去加日誌資訊的話,方法數量少的情況還可以勉強維護,如果數量多的話,維護起來就比較頭疼了。這個時候我們就可以使用Aop來統一管理這些日誌資訊,後期的維護也就相對輕鬆的多了。
Aop實現的核心,總結起來就是攔截和代理。Aop定義了三大核心屬性,分別是基礎,切面和配置。基礎就是需要實現實現增強的目標物件,不過專案中一般都是使用Aop來對目標方法實現增強。這個增強可以理解為增加一些其它的功能,比如上文提到的列印日誌資訊等。而切面的作用就是這個增強,在原有的目標物件身上增加一些額外的功能。配置的作用就是把基礎和切面結合起來。
介紹完了Aop的定義,接著再來看下Aop的實現。Aop的實現中有三個介面,分別是Advice(通知),Pointcut(切點)和Advisor(通知器)。其中Advice的作用是對目標物件實現增強。雖然有了增強的功能,但是要在哪裡進行增強的織入呢,這個時候就要用到Pointcut,Pointcut中定義了需要實現增強的方法的集合,然後根據正則表示式或者方法名進行匹配,確認具體要實現增強的目標方法。最後通過Advisor將Advice和Pointcut結合起來。
Aop的基本屬性初步介紹了一下,下面通過一個簡單的Aop應用來開始Aop實現的原始碼分析。
定義一個名為Student的介面:
實現類:
我們想在不改變原始碼的情況下,在addStudent方法的輸出語句前後分別加入其它功能,比如在列印語句前後加入其它的列印資訊,這中情況就是Aop的典型應用場景。根據Aop的定義,addStudent就是目標方法,需要對其實現增強功能。既然前後都都要實現增強,那麼我們可以分別實現MethodBeforeAdvice介面和AfterReturningAdvice介面。這兩個介面都繼承Advice介面,目的就是對目標方法實現增強。
前置增強:
後置增強:
可以適當的加入些攔截器:
現在目標方法有了,增強也有了,需要將目標方法和增強結合起來,實現對目標方法的增強,這個時候就需要一個配置了。
配置:
這些配置都配置在Spring預設的配置檔案中。至於配置中相關配置項的意義及作用,後面進行原始碼分析的時候會逐一進行解釋。
測試類:
執行結果如下:
關於Spring中Aop的基本使用方式就暫且解釋到此,下一篇中將會開始Aop執行原理的原始碼分析。
未完待續。。。。。。