您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么搭建一個AOP測試環境”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
寫在前面
金九銀十的跳槽黃金期已拉開序幕,相信很多小伙伴也在摩拳擦掌,想換一個新的工作環境。然而,由于今年疫情的影響,很多企業對于招聘的要求是越來越嚴格。之前,很多不被問及的知識點,最近面試時都會被問到了。這不,有些面試官竟然讓面試者現場搭建一個AOP測試環境。那怎么辦呢?那就給他搭建一個唄!
什么是AOP?
AOP (Aspect Orient Programming),直譯過來就是 面向切面編程。AOP 是一種編程思想,是面向對象編程(OOP)的一種補充。面向對象編程將程序抽象成各個層次的對象,而面向切面編程是將程序抽象成各個切面。
比如,在《Spring實戰(第4版)》中有如下一張圖描述了AOP的大體模型。
從這張圖中,我們可以看出:所謂切面,相當于應用對象間的橫切點,我們可以將其單獨抽象為單獨的模塊。
總之一句話:AOP是指在程序的運行期間動態的將某段代碼切入到指定方法、指定位置進行運行的編程方式。AOP的底層是使用動態代理實現的。
搭建環境
1.導入AOP依賴
要想搭建AOP環境,首先,我們就需要在項目的pom.xml文件中引入AOP的依賴,如下所示。
<properties> <spring.version>5.2.6.RELEASE</spring.version> </properties> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>
2.定義目標類
在io.mykit.spring.plugins.register.aop包下創建一個MathHandler類,用于處理數學計算上的一些邏輯。比如,我們在MathHandler類中定義了一個加法操作,返回兩個整數類型值的和,如下所示。
package io.mykit.spring.plugins.register.aop; /** * @author binghe * @version 1.0.0 * @description 定義一個數據處理器類,用于測試AOP */ public class MathHandler { public int add(int i, int j){ System.out.println("目標方法執行"); return i + j; } }
3.定義切面類
在io.mykit.spring.plugins.register.aspect包下創建一個LogAspect切面類,在LogAspect類中定義了幾個打印日志的方法,以這些方法來感知MathHandler類中的add()方法的運行情況。如果需要切面類來感知目標類方法的運行情況,則需要使用Spring AOP中的通知方法。
AOP中的通知方法及其注解與含義如下:
前置通知(@Before):在目標方法運行之前運行。
后置通知(@After):在目標方法運行結束之后運行,不管是正常結束還是異常結束都會執行。
返回通知(@AfterReturning):在目標方法正常返回之后運行。
異常通知(@AfterThrowing):在目標方法拋出異常后運行。
環繞通知(@Around):動態代理,手動推進目標方法運行。
綜上,LogAspect類中的具體方法定義如下所示。
package io.mykit.spring.plugins.register.aspect; import org.aspectj.lang.annotation.*; /** * @author binghe * @version 1.0.0 * @description 打印日志的切面類 */ @Aspect public class LogAspect { @Pointcut("execution(public int io.mykit.spring.plugins.register.aop.MathHandler.*(..))") public void pointCut(){ } @Before("pointCut()") public void logStart(){ System.out.println("加法運行開始,參數列表是:{}"); } @After("pointCut()") public void logEnd(){ System.out.println("加法運行結束"); } @AfterReturning("pointCut()") public void logReturn(){ System.out.println("加法正常返回,運行結果:{}"); } @AfterThrowing("pointCut()") public void logException(){ System.out.println("加法異常,異常信息:{}"); } }
logStart()方法:MathHandler類的add()方法運行之前運行。
logEnd()方法:MathHandler類的add()方法運行結束之后運行。
logReturn()方法:MathHandler類的add()方法正常返回之后運行。
logException()方法:MathHandler類的add()方法拋出異常后執行。
4.將目標類和切面類加入到IOC容器
在io.mykit.spring.plugins.register.config包中,新建AopConfig類,并使用@Configuration注解標注這是一個Spring的配置類,同時使用@EnableAspectJAutoProxy注解開啟基于注解的AOP模式。在AopConfig類中,使用@Bean注解將MathHandler類和LogAspect類加入到IOC容器中,如下所示。
package io.mykit.spring.plugins.register.config; import io.mykit.spring.plugins.register.aop.MathHandler; import io.mykit.spring.plugins.register.aspect.LogAspect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * @author binghe * @version 1.0.0 * @description 測試AOP */ @Configuration @EnableAspectJAutoProxy public class AopConfig { @Bean public MathHandler mathHandler(){ return new MathHandler(); } @Bean public LogAspect logAspect(){ return new LogAspect(); } }
5.創建測試類
在 io.mykit.spring.test包中創建AopTest測試類,并在AopTest類中創建testAop01()方法,如下所示。
package io.mykit.spring.test; import io.mykit.spring.plugins.register.aop.MathHandler; import io.mykit.spring.plugins.register.config.AopConfig; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @author binghe * @version 1.0.0 * @description 測試切面 */ public class AopTest { @Test public void testAop01(){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); MathHandler mathHandler = context.getBean(MathHandler.class); mathHandler.add(1, 2); context.close(); } }
運行AopTest類中的testAop01()方法,輸出的結果信息如下所示。
加法運行開始,參數列表是:{} 目標方法執行 加法運行結束 加法正常返回,運行結果:{}
可以看到,執行了切面類中的方法,并打印出了相關信息。但是沒有打印參數列表和運行結果。
6.在切面類中打印參數列表和返回結果
那如果需要打印出參數列表和運行結果,該怎么辦呢?別急,我們繼續往下看。
要想打印出參數列表和運行結果,就需要對LogAspect類中的方法進行優化,優化后的結果如下所示。
package io.mykit.spring.plugins.register.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import java.util.Arrays; /** * @author binghe * @version 1.0.0 * @description 打印日志的切面類 */ @Aspect public class LogAspect { @Pointcut("execution(public int io.mykit.spring.plugins.register.aop.MathHandler.*(..))") public void pointCut(){ } @Before("pointCut()") public void logStart(JoinPoint joinPoint){ System.out.println(joinPoint.getSignature().getName() + " 運行開始,參數列表是:{"+ Arrays.asList(joinPoint.getArgs()) +"}"); } @After("pointCut()") public void logEnd(JoinPoint joinPoint){ System.out.println(joinPoint.getSignature().getName() + " 運行結束"); } @AfterReturning(value = "pointCut()", returning = "result") public void logReturn(JoinPoint joinPoint, Object result){ System.out.println(joinPoint.getSignature().getName() + " 正常返回,運行結果:{"+result+"}"); } @AfterThrowing(value = "pointCut()", throwing = "exception") public void logException(JoinPoint joinPoint, Exception exception){ System.out.println(joinPoint.getSignature().getName() + " 異常,異常信息:{"+exception+"}"); } }
這里,需要注意的是:JoinPoint參數一定要放在參數的第一位。
此時,我們再次運行AopTest類中的testAop01()方法,輸出的結果信息如下所示。
add 運行開始,參數列表是:{[1, 2]} 目標方法執行 add 運行結束 add 正常返回,運行結果:{3}
7.目標方法拋出異常
我們在MathHandler類的add()方法中拋出一個異常,來測試下異常情況,如下所示。
package io.mykit.spring.plugins.register.aop; /** * @author binghe * @version 1.0.0 * @description 定義一個數據處理器類,用于測試AOP */ public class MathHandler { public int add(int i, int j){ System.out.println("目標方法執行"); throw new RuntimeException(); //return i + j; } }
此時,我們再次運行AopTest類中的testAop01()方法,輸出的結果信息如下所示。
add 運行開始,參數列表是:{[1, 2]} 目標方法執行 add 運行結束 add 異常,異常信息:{java.lang.RuntimeException}
可以看到,正確的輸出了切面中打印的信息。
“怎么搭建一個AOP測試環境”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。