AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。java
AOP是Spring框架中的一個重要內容,它經過對既有程序定義一個切入點,而後在其先後切入不一樣的執行內容,好比常見的有:web
打開數據庫鏈接/關閉數據庫鏈接、打開事務/關閉事務、記錄日誌等。基於AOP不會破壞原來程序邏輯,所以它能夠很好的對業務邏輯的各個部分進行隔離,spring
從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。數據庫
準備工做:編程
pom中引入:框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
* Spring Boot中使用AOP統一處理Web請求日誌
* 使用@Aspect註解將一個java類定義爲切面類
* 使用@Pointcut定義一個切入點,能夠是一個規則表達式,好比下例中某個package下的全部函數,也能夠是一個註解等。
* 根據須要在切入點不一樣位置的切入內容
* 使用@Before在切入點開始處切入內容
* 使用@After在切入點結尾處切入內容
* 使用@AfterReturning在切入點return內容以後切入內容(能夠用來對處理返回值作一些加工處理)
* 使用@Around在切入點先後切入內容,並本身控制什麼時候執行切入點自身的內容
* 使用@AfterThrowing用來處理當切入內容部分拋出異常以後的處理邏輯函數
/***
* 在WebLogAspect切面中,分別經過doBefore和doAfterReturning兩個獨立函數實現了切點頭部和
* 切點返回後執行的內容,若咱們想統計請求的處理時間,就須要在doBefore處記錄時間,並在doAfterReturning
* 處經過當前時間與開始處記錄的時間計算獲得請求處理的消耗時間。
* 那麼咱們是否能夠在WebLogAspect切面中定義一個成員變量來給doBefore和doAfterReturning一塊兒訪問呢?
* 是否會有同步問題呢?
* 的確,直接在這裏定義基本類型會有同步問題,因此咱們能夠引入ThreadLocal對象
*/spring-boot
/***
* 優化:AOP切面的優先級
* 因爲經過AOP實現,程序獲得了很好的解耦,可是也會帶來一些問題,好比:咱們可能會對Web層作多個切面,校驗用戶,校驗頭信息等等,這個時候常常會碰到切面的處理順序問題。
* 因此,咱們須要定義每一個切面的優先級,咱們須要@Order(i)註解來標識切面的優先級。i的值越小,優先級越高。假設咱們還有一個切面是CheckNameAspect用來校驗name必須爲didi,
* 咱們爲其設置@Order(10),而上文中WebLogAspect設置爲@Order(5),因此WebLogAspect有更高的優先級,這個時候執行順序是這樣的:
* 在@Before中優先執行@Order(5)的內容,再執行@Order(10)的內容
* 在@After和@AfterReturning中優先執行@Order(10)的內容,再執行@Order(5)的內容
* 因此咱們能夠這樣子總結:
* 在切入點前的操做,按order的值由小到大執行
* 在切入點後的操做,按order的值由大到小執行
*/優化