從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資料庫,並確認沒有遇到亂碼問題。...