Spring AOP AspectJ 入門例項

2021-07-11 18:55:12 字數 2590 閱讀 2001

從spring 2.0開始,可以使用基於schema及@aspectj的方式來實現aop,本文以乙個簡單的例項介紹了如何以@aspectj方式在spring中實現aop。由於@aspect是基於註解的,因此要求支援註解的5.0版本以上的jdk。

環境要求:

1. web應用

2. 有乙個專門提供系統服務的service層

我們的目標是,如果使用者呼叫service層中任一方法,都在其插入乙個記錄資訊的功能。

1. 乙個最簡單的aop

共有2步。

1.1 定義乙個aspect

1.  package com.sarkuya.aop.aspect;

2.  import org.aspectj.lang.annotation.aspect;

3.  import org.aspectj.lang.annotation.before;

4.  @aspect

5.  public class sampleaspect

12. }

第4行,必須使用@aspect在類名之前註解。

第6行,當使用者呼叫com.sarkuya.service包中任一類的任一方法,在呼叫前,spring將自動執行下面的dobeforeinservicelayer()方法,此方法只是簡單地列印一些資訊。

"   xmlns:xsi=""

xmlns:p="" xmlns:aop=""

xsi:schemalocation="

/spring-beans-2.5.xsd

/spring-aop-2.5.xsd">

就這麼簡單。

2. 將pointcut及advice分開

上面的aspect中混雜了pointcut及advice,因此最好將其分開。共有3步。

2.1 定義pointcut

1.  package com.sarkuya.aop.aspect;

2.  import org.aspectj.lang.annotation.aspect;

3.  import org.aspectj.lang.annotation.pointcut;

4.  @aspect

5.  public class sampleaspect

9.  }

pointcut是植入advice的觸發條件。每個pointcut的定義包括2部分,一是表示式,如第6行;二是方法簽名,如第7行。方法簽名必須是public及void型。可以將pointcut中的方法看作是乙個被advice引用的助記符,因為表示式不直觀,因此我們可以通過方法簽名的方式為此表示式命名。因此pointcut中的方法只需要方法簽名,而不需要在方法體內編寫實際**。

2.2 定義advice

1.  package com.sarkuya.aop.advice;

2.  import org.aspectj.lang.annotation.aspect;

3.  import org.aspectj.lang.annotation.before;

4.  @aspect

5.  public class sampleadvice

12. }

第4行,對於advice,也只能使用@aspect來註解。

第6行,與第1.1節中第6行不同,這次不是直接使用pointcut的表示式,而是使用了pointcut中的方法簽名。

單獨定義pointcut的好處是,一是通過使用有意義的方法名,而不是難讀的pointcut表示式,使**更加直觀;二是pointcut可以實現共享,被多個advice直接呼叫。若有多個advice呼叫某個pointcut,而這個pointcut的表示式在將來有改變時,只需修改乙個地方,維護更加方便。

第7行,我們將advice的方法法改為loginfo(),以更加明確此advice的作用。

2.3 配置檔案

只需配置sampleadvice,無需配置sampleaspect。

3. 重構:明確pointcut職責

對於sampleaspect來說,其主要職責是定義pointcut,可以在此類中同時定義多個pointcuts。但其類名反映不出這個特點,因此,應將其重構以明確其職責。

package com.sarkuya.aop.pointcut;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.pointcut;

@aspect

public class pointcutsdefinition

}將sampleaspect重新命名為pointcutsdefinition,並移到com.sarkuya.aop.pointcut包中。

對於sampleadvice來說,只需改變@before()的註解,指向

@before("com.sarkuya.aop.pointcut.pointcutsdefinition.inservicelayer()")

而spring配置檔案保持不變。

小結:我們先從乙個最簡單的aspect例項開始,了解aop的作用及最基本的要求,再重構為更有意義的**,明確了aop中的pointcut及advice的概念,有助於我們構建更複雜的aspect。

Spring AOP AspectJ 入門例項

從spring 2.0開始,可以使用基於schema及 aspectj的方式來實現aop,本文以乙個簡單的例項介紹了如何以 aspectj方式在spring中實現aop。由於 aspect是基於註解的,因此要求支援註解的5.0版本以上的jdk。環境要求 1.web應用 2.有乙個專門提供系統服務的s...

Fabric private data入門實戰

hyperledger fabric private data是1.2版本引入的新特性,fabric private data是利用旁支資料庫 sidedb 來儲存若干個通道成員之間的私有資料,從而在通道之上又提供了一層更靈活的資料保護機制。本文將介紹如何在鏈碼開發中使用fabric private...

OFBiz入門實訓教程

加速度 15000850008 大家只要按我的部落格指導下學習2個月,就可以成為乙個熟練的ofbiz開發人員。加速度 15000850008 2014.07.13 1 執行啟動ofbiz。了解ofbiz的大致功能。2 切換ofbiz的預設資料庫debry,為mysql資料庫,並確認沒有遇到亂碼問題。...