1. 程式人生 > >Spring-AOP【總結】

Spring-AOP【總結】

概念

AOP(Aspect Oriented Programming),即面向切面程式設計(也叫面向方面程式設計,面向方法程式設計)。其主要作用是,在不修改原始碼的情況下給某個或者一組操作新增額外的功能。像日誌記錄,事務處理,許可權控制等功能,都可以用AOP來“優雅”地實現,使這些額外功能和真正的業務邏輯分離開來,軟體的結構將更加清晰。AOP是OOP的一個強有力的補充。

術語

AOP的術語不太直觀,Spring文件中也沒有給一個確切的定義,所以重在理解。

  • Join Point: Spring AOP中,join point就是一個方法。(通俗來講就是起作用的那個方法)。

  • Pointcut: 用來指定join point(通俗來講就是描述的一組符合某個條件的join point)。通常使用pointcut表示式來限定joint point,Spring預設使用AspectJ pointcut expression language。

  • Advice: 在join point上特定的時刻執行的操作,Advice有幾種不同型別,下文將會討論(通俗地來講就是起作用的內容和時間點)。

  • Introduction:給物件增加方法或者屬性。

  • Target object: Advice起作用的那個物件。

  • AOP proxy: 為實現AOP所生成的代理。在Spring中有兩種方式生成代理:JDK代理和CGLIB代理。

  • Aspect: 組合了Pointcut與Advice,在Spring中有時候也稱為Advisor。某些資料說Advisor是一種特殊的Aspect,其區別是Advisor只能包含一對pointcut和advice,但是aspect可以包含多對。AOP中的aspect可以類比於OOP中的class。

  • Weaving:將Advice織入join point的這個過程。

Advice的型別

  • Before advice:  執行在join point之前的advice,但是它不能阻止joint point的執行流程,除非丟擲了一個異常(exception)。

  • After returning advice: 執行在join point這個方法返回之後的advice。

  • After throwing advice: 執行在join point丟擲異常之後的advice。

  • After(finally) advice: 執行在join point返回之後或者丟擲異常之後的advice,通常用來釋放所使用的資源。

  • Around advice: 執行在join point這個方法執行之前與之後的advice。

兩種代理

Spring AOP是基於代理機制的。上文說到,Spring AOP通過JDK Proxy和CGLIB Proxy兩種方法實現代理。

如果target object沒有實現任何介面,那麼Spring將使用CGLIB來實現代理。CGLIB是一個開源專案,它是一個強大的,高效能,高質量的Code生成類庫,它可以在執行期擴充套件Java類與實現Java介面。

如果target object實現了一個以上的介面,那麼Spring將使用JDK Proxy來實現代理,因為Spring預設使用的就是JDK Proxy,並且JDK Proxy是基於介面的。這也是Spring提倡的面向介面程式設計。當然,你也可以強制使用CGLIB來進行代理,但是這樣可能會造成效能上的下降。

Pointcut expression

Pointcut通過pointcut expression來描述,有若干種限定詞。由於Pointcut的定義在Spring文件7.2.3 Declaring a pointcut中寫得比較詳細,所以在此不再贅述。

Spring AOP的使用

我們可以通過三種方式來使用Spring AOP,它們分別是:@Aspect-based(Annotation),Schema-based(XML),以及底層的Spring AOP API。

@Aspect-based (Annotation)

Annotaion是最常用的方式。

配置

首先,我們應該在配置檔案中增加對Annotation的支援。

假設我們的配置檔案是classpath下的applicationContext.xml,新增如下片段:

1
<aop:aspectj-autoproxy />

業務邏輯類

假設我們有一個UserManager類,這個類負責處理業務邏輯。類的定義如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class UserManager {
  /*這個方法需要一個引數*/
  public void addUser(String user) {
      System.out.println("addUser(String str) method is executed!");
  }
  public void deleteUser() {
      System.out.println("deleteUser() method is executed!");
  }
  /*這個方法返回一個字串*/
  public String getUser() {
      System.out.println("getUser() method is executed!");
      return "Hello";
  }
  /*這個方法丟擲一個異常*/
  public void editUser() throws Exception {
      throw new Exception("something is wrong.");
  }    
}

這是一個很普通的Java物件,看不出任何Spring AOP的痕跡,這也是Spring低侵入式設計的體現。

切面(Aspect)類

為了給業務邏輯增加額外功能,我們需要定義一個切面類,切面類裡包含了pointcut和advice。假設我們的切面類是ExampleAspect,程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Aspect
public class ExampleAspect {
  @Pointcut("execution(* com.psjay.example.spring.aop.*.*(..))")
  public void aPointcut() {
  }
  @Before("aPointcut()")
  public void beforeAdvice() {
      System.out.println("before advice is executed!");
  }
  @AfterReturning(pointcut = "aPointcut()", returning="r")
  public void afterReturningAdvice(String r) {
      if (r != null)
          System.out.println("after returning advice is executed! returning String is : " + r);
  }
  @After("aPointcut()")
  public void AfterAdvice() {
      System.out.println("after advice is executed!");
  }
  @After("aPointcut() && args(str)")
  public void AfterAdviceWithArg(String str) {

            
           

相關推薦

Spring-AOP總結

概念 AOP(Aspect Oriented Programming),即面向切面程式設計(也叫面向方面程式設計,面向方法程式設計)。其主要作用是,在不修改原始碼的情況下給某個或者一組操作新增額外的功能。像日誌記錄,事務處理,許可權控制等功能,都可以用AOP來“優雅

面試Spring常見問題總結06

類名 truct htm 持久化框架 type 兩個 請求 method val 【常見面試問題總結文件夾>>>】 51、spring中的applicationContext.xml能不能改為其它名字 ContextLoaderListene

面試Spring常見問題總結07

之間 編程方式 順序 莫名其妙 接口編程 情況 spring容器 相互 lazy 【常見面試問題總結文件夾>>>】 61、Spring IoC容器的依賴有兩層含義: Bean依賴容器:也就是說Bean要依賴於容器,這裏的依賴是指容器負責創建B

Java動態代理學習Spring AOP基礎之一

tor -1 我們 null exception 文件 cat static 一個   Spring AOP使用的其中一個底層技術就是Java的動態代理技術。Java的動態代理技術主要圍繞兩個類進行的    java.lang.reflect.InvocationHan

CgLib動態代理學習Spring AOP基礎之一

div 目前 .get 不知道 ctu get() 內容 想要 外部依賴   如果不了解JDK中proxy動態代理機制的可以先查看上篇文章的內容:Java動態代理學習【Spring AOP基礎之一】   由於Java動態代理Proxy.newProxyInstance()的

Spring Boot學習總結14.Spring Boot整合Redis-與傳統方式對比

前面我們講解了如何使用Spring Boot來控制事務,下面我們來講解一下如何使用Spring Boot來整合Redis 為了對比傳統工程與Spring Boot整合的不同,以及彰顯Spring Boot整合的優勢,我們會逐一剖析傳統整合方式與Spring Boot整合方式。 一、傳統方式整

Spring Boot學習總結13.Spring Boot事務控制

上一篇我們講解了Spring Boot與MyBatis的結合開發,併成功操作了資料庫。眾所周知,保證資料庫一致性的操作,就是事務的控制。 而Spring事務管理可以分為兩種:程式設計式以及宣告式。 其中程式設計式事務就是使用編寫程式碼的方式,進行事務的控制。而宣告式事務一般通

Spring Boot學習總結6.SpringBoot全域性配置檔案

上一篇我們總結了SpringBoot的核心註解以及一些簡單的配置,本篇我們來了解SpringBoot的全域性配置檔案。 Spring Boot專案使用一個全域性配置檔案application.properties或者是application.yml,在resource目錄下

Nginx教程(7) 正向代理與反向代理總結

資料 用戶訪問 認證 origin 訪問者 發送 -128 負載 行為 1、前言   最近工作中用到反向代理,發現網絡代理的玩法還真不少,網絡背後有很多需要去學習。而在此之前僅僅使用了過代理軟件,曾經為了訪問google,使用了代理軟件,需要在瀏覽器中配置代理的地址。我只知

總結spark按文本格式和Lzo格式處理Lzo壓縮文件的比較

spark lzotextinputformat1、描述spark中怎麽加載lzo壓縮格式的文件2、比較lzo格式文件以textFile方式和LzoTextInputFormat方式計算數據,Running Tasks個數的影響 a.確保lzo文件所在文件夾中生成lzo.index索引文件 b.以

測試方法總結

測試方法測試方法從測試設計方法分類測試名稱測試內容黑盒測試把軟件系統當作一個黑箱,無法了解或使用系統內部結構及知識白盒測試設計者可以看到軟件系統的內部結構,並且使用軟件的內部知識來指導測試數據及方法的選擇灰盒測試介於白盒和黑盒之間總結:在實際工作中,對系統的了解越多越好,目前大多數的測試人員都是做黑盒測試,很

總結差分約束模型的要點

cio 一個點 ros 最短路 所有 運行時間 16px net 不同   只是一些自己想到的東西,記下來以防忘記。   1. 求解一系列的 f[b] - f[a] <= x 不等式組時,由a向b建權值為x的邊,求最短路。有負環時無解,體現為在SPFA中一個點入隊

HTTP響應狀態碼總結

管理 指示 get 強制 opp 帶寬 行修改 accepted 代碼 常見的狀態碼【1XX】表示【消息】【2XX】表示【成功】【3XX】表示【重定向】【4XX】表示【請求錯誤】【5XX】表示【服務器端錯誤】200:OK。請求被正常處理204:No Content。請求被受

總結曼哈頓距離轉切比雪夫距離

現在 樹狀 use clas user height int 前綴和 比較 我們在用二維樹狀數組的時候,可以得到一個邊與坐標軸平行的矩形內點集的信息。 如果我們需要得到得到到一個點的距離小於等於K的點的信息呢。這些點構成的不在是邊也坐標軸

總結2017年個人總結

需要 一點 自己 編號 說話 計算 family 今天 美的 今天元宵,於是乎想寫個個人總結吧,反正最近又沒什麽學習的動力了,寫寫總結暫時停下休息吧 2017年怎麽說呢,前半年還在高中忙著高考,下午吃完飯就立刻跑去自習室做我的那本數學的《百題大過關》,老實說下午去自習室的這

總結遊戲框架與架構設計(Unity為例)

單機 業務 github 事件 概念 lec 集合 架構模式 wid 使用框架開發遊戲 優點:耦合性低,重用性高,部署快,可維護性高,方便管理。提高開發效率,降低開發難度 缺點:增加了系統結構和實現的復雜性,需要額外花費精力維護,不適合小型程序,易影響運行效率 常見

總結Unity遊戲優化

硬盤 技術 wheel mes stringbu 臨時 ets 減少 e30 1、Profiler中一項"WaitForTargetFPS"費資源過高的原因 畫面撕裂,顯卡渲染輸出的速度與顯示器不同步, 如果顯示器刷新的同時,顯卡創造了新的幀,就會出現上半顯示器顯示前一

總結遊戲AI人工智能

人物 unity3d 元組 and 事件驅動 area 更新 多維 行為樹 參考書籍《Unity3D人工智能編程精粹》《Unity3D人工智能編程》 遊戲AI的架構模型 運動層:AI的具體行為,比如移動 決策層:決定AI下一時間步該做什麽 戰略層:從集體層面對個體

總結Unity動畫模塊

作用 inf 數據 err size rotation current 程序 相互 動畫模塊沒有太多好說的,更多是練習積累的經驗 Animator動畫控制器 AnimatorControllerLayer 狀態層,layer層級越高,動作優先級越高 Animato

總結偏序/數點

說過 適合 聽說 貢獻 amp clas 。。 inline line 這是一篇關於偏序/數點的總結 偏序是個什麽東西? 我不知道準確的定義 但大概是以下例子表達出來的意思 一維偏序:一堆一維點,對於每個 \(i\) 求滿足 \(point[j].x<=point[i