您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關使用Spring Aop如何配置AspectJ注解,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
采用的jdk代理,接口和實現類代碼請參考上篇博文。主要是將Aspect類分享一下:
package com.tgb.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclareParents; import org.aspectj.lang.annotation.Pointcut; /** * 測試after,before,around,throwing,returning Advice. * @author Admin * */ @Aspect public class AspceJAdvice { /** * Pointcut * 定義Pointcut,Pointcut的名稱為aspectjMethod(),此方法沒有返回值和參數 * 該方法就是一個標識,不進行調用 */ @Pointcut("execution(* find*(..))") private void aspectjMethod(){}; /** * Before * 在核心業務執行前執行,不能阻止核心業務的調用。 * @param joinPoint */ @Before("aspectjMethod()") public void beforeAdvice(JoinPoint joinPoint) { System.out.println("-----beforeAdvice().invoke-----"); System.out.println(" 此處意在執行核心業務邏輯前,做一些安全性的判斷等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of beforeAdvice()------"); } /** * After * 核心業務邏輯退出后(包括正常執行結束和異常退出),執行此Advice * @param joinPoint */ @After(value = "aspectjMethod()") public void afterAdvice(JoinPoint joinPoint) { System.out.println("-----afterAdvice().invoke-----"); System.out.println(" 此處意在執行核心業務邏輯之后,做一些日志記錄操作等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of afterAdvice()------"); } /** * Around * 手動控制調用核心業務邏輯,以及調用前和調用后的處理, * * 注意:當核心業務拋異常后,立即退出,轉向AfterAdvice * 執行完AfterAdvice,再轉到ThrowingAdvice * @param pjp * @return * @throws Throwable */ @Around(value = "aspectjMethod()") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("-----aroundAdvice().invoke-----"); System.out.println(" 此處可以做類似于Before Advice的事情"); //調用核心邏輯 Object retVal = pjp.proceed(); System.out.println(" 此處可以做類似于After Advice的事情"); System.out.println("-----End of aroundAdvice()------"); return retVal; } /** * AfterReturning * 核心業務邏輯調用正常退出后,不管是否有返回值,正常退出后,均執行此Advice * @param joinPoint */ @AfterReturning(value = "aspectjMethod()", returning = "retVal") public void afterReturningAdvice(JoinPoint joinPoint, String retVal) { System.out.println("-----afterReturningAdvice().invoke-----"); System.out.println("Return Value: " + retVal); System.out.println(" 此處可以對返回值做進一步處理"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of afterReturningAdvice()------"); } /** * 核心業務邏輯調用異常退出后,執行此Advice,處理錯誤信息 * * 注意:執行順序在Around Advice之后 * @param joinPoint * @param ex */ @AfterThrowing(value = "aspectjMethod()", throwing = "ex") public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) { System.out.println("-----afterThrowingAdvice().invoke-----"); System.out.println(" 錯誤信息:"+ex.getMessage()); System.out.println(" 此處意在執行核心業務邏輯出錯時,捕獲異常,并可做一些日志記錄操作等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of afterThrowingAdvice()------"); } }
application-config.xml中,只需要配置業務邏輯bean和Aspect bean,并啟用Aspect注解即可:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 啟用AspectJ對Annotation的支持 --> <aop:aspectj-autoproxy/> <bean id="userManager" class="com.tgb.aop.UserManagerImpl"/> <bean id="aspcejHandler" class="com.tgb.aop.AspceJAdvice"/> </beans>
結果如圖:
通過測試的發現AroundAdvice、BeforeAdvice、AfterAdvice、ReturningAdvice的執行順序是根據注解的順序而定的。但是有時候修改了順序,結果卻沒有變化,可能是緩存的緣故。前幾天我也遇到了這樣的問題,不過今天再測試了一下,發現執行順序又跟注解的順序一致了。
xml 和 Annotation 注解都可以作為配置項,對Spring AoP進行配置管理,那么它們各自都有什么優缺點呢?
首先說說 xml 。目前 web 應用中幾乎都使用 xml 作為配置項,例如我們常用的框架 Struts、Spring、hibernate 等等都采用 xml 作為配置。xml 之所以這么流行,是因為它的很多優點是其它技術的配置所無法替代的:
雖然有如此多的好處,但畢竟沒有什么萬能的東西,xml 也有自身的缺點。
讓我們來看看 Annotation 的優點。
同樣 Annotation 也不是萬能的,它也有很多缺點。
總結:沒有一個事物是萬能的,同樣 xml 和 Java Annotation 都有各自的優缺點。通過以上對比,細心的讀者可能已經發現它們的優缺點恰恰是互補的。xml 的強項是 Annotation 所不具備的,而 Annotation 的優勢也是 xml 所欠缺的。這也正是時下流行的 xml + Annotation 配置的原因所在。平衡才是王道呀!
關于使用Spring Aop如何配置AspectJ注解就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。