日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
你敢信?面試官竟然讓我現(xiàn)場(chǎng)搭建一個(gè)AOP測(cè)試環(huán)境!

作者個(gè)人研發(fā)的在高并發(fā)場(chǎng)景下,提供的簡(jiǎn)單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開源半年多以來(lái),已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。為使更多童鞋受益,現(xiàn)給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

創(chuàng)新互聯(lián)公司是專業(yè)的昌樂(lè)網(wǎng)站建設(shè)公司,昌樂(lè)接單;提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行昌樂(lè)網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

寫在前面

金九銀十的跳槽黃金期已拉開序幕,相信很多小伙伴也在摩拳擦掌,想換一個(gè)新的工作環(huán)境。然而,由于今年疫情的影響,很多企業(yè)對(duì)于招聘的要求是越來(lái)越嚴(yán)格。之前,很多不被問(wèn)及的知識(shí)點(diǎn),最近面試時(shí)都會(huì)被問(wèn)到了。這不,有些面試官竟然讓面試者現(xiàn)場(chǎng)搭建一個(gè)AOP測(cè)試環(huán)境。那怎么辦呢?那就給他搭建一個(gè)唄!

什么是AOP?

AOP (Aspect Orient Programming),直譯過(guò)來(lái)就是 面向切面編程。AOP 是一種編程思想,是面向?qū)ο缶幊?OOP)的一種補(bǔ)充。面向?qū)ο缶幊虒⒊绦虺橄蟪筛鱾€(gè)層次的對(duì)象,而面向切面編程是將程序抽象成各個(gè)切面。

比如,在《Spring實(shí)戰(zhàn)(第4版)》中有如下一張圖描述了AOP的大體模型。

從這張圖中,我們可以看出:所謂切面,相當(dāng)于應(yīng)用對(duì)象間的橫切點(diǎn),我們可以將其單獨(dú)抽象為單獨(dú)的模塊。

總之一句話:AOP是指在程序的運(yùn)行期間動(dòng)態(tài)的將某段代碼切入到指定方法、指定位置進(jìn)行運(yùn)行的編程方式。AOP的底層是使用動(dòng)態(tài)代理實(shí)現(xiàn)的。

搭建環(huán)境

1.導(dǎo)入AOP依賴

要想搭建AOP環(huán)境,首先,我們就需要在項(xiàng)目的pom.xml文件中引入AOP的依賴,如下所示。

 
 
 
 
  1.  
  2.     5.2.6.RELEASE 
  3.  
  4.  
  5.     org.springframework 
  6.     spring-aspects 
  7.     ${spring.version} 
  8.  

2.定義目標(biāo)類

在io.mykit.spring.plugins.register.aop包下創(chuàng)建一個(gè)MathHandler類,用于處理數(shù)學(xué)計(jì)算上的一些邏輯。比如,我們?cè)贛athHandler類中定義了一個(gè)加法操作,返回兩個(gè)整數(shù)類型值的和,如下所示。

 
 
 
 
  1. package io.mykit.spring.plugins.register.aop; 
  2. /** 
  3.  * @author binghe 
  4.  * @version 1.0.0 
  5.  * @description 定義一個(gè)數(shù)據(jù)處理器類,用于測(cè)試AOP 
  6.  */ 
  7. public class MathHandler { 
  8.  
  9.     public int add(int i, int j){ 
  10.         System.out.println("目標(biāo)方法執(zhí)行"); 
  11.         return i + j; 
  12.     } 

3.定義切面類

在io.mykit.spring.plugins.register.aspect包下創(chuàng)建一個(gè)LogAspect切面類,在LogAspect類中定義了幾個(gè)打印日志的方法,以這些方法來(lái)感知MathHandler類中的add()方法的運(yùn)行情況。如果需要切面類來(lái)感知目標(biāo)類方法的運(yùn)行情況,則需要使用Spring AOP中的通知方法。

AOP中的通知方法及其注解與含義如下:

  • 前置通知(@Before):在目標(biāo)方法運(yùn)行之前運(yùn)行。
  • 后置通知(@After):在目標(biāo)方法運(yùn)行結(jié)束之后運(yùn)行,不管是正常結(jié)束還是異常結(jié)束都會(huì)執(zhí)行。
  • 返回通知(@AfterReturning):在目標(biāo)方法正常返回之后運(yùn)行。
  • 異常通知(@AfterThrowing):在目標(biāo)方法拋出異常后運(yùn)行。
  • 環(huán)繞通知(@Around):動(dòng)態(tài)代理,手動(dòng)推進(jìn)目標(biāo)方法運(yùn)行。

綜上,LogAspect類中的具體方法定義如下所示。

 
 
 
 
  1. package io.mykit.spring.plugins.register.aspect; 
  2. import org.aspectj.lang.annotation.*; 
  3. /** 
  4.  * @author binghe 
  5.  * @version 1.0.0 
  6.  * @description 打印日志的切面類 
  7.  */ 
  8. @Aspect 
  9. public class LogAspect { 
  10.  
  11.     @Pointcut("execution(public int io.mykit.spring.plugins.register.aop.MathHandler.*(..))") 
  12.     public void pointCut(){ 
  13.  
  14.     } 
  15.  
  16.     @Before("pointCut()") 
  17.     public void logStart(){ 
  18.         System.out.println("加法運(yùn)行開始,參數(shù)列表是:{}"); 
  19.     } 
  20.  
  21.     @After("pointCut()") 
  22.     public void logEnd(){ 
  23.         System.out.println("加法運(yùn)行結(jié)束"); 
  24.     } 
  25.  
  26.     @AfterReturning("pointCut()") 
  27.     public void logReturn(){ 
  28.         System.out.println("加法正常返回,運(yùn)行結(jié)果:{}"); 
  29.     } 
  30.  
  31.     @AfterThrowing("pointCut()") 
  32.     public void logException(){ 
  33.         System.out.println("加法異常,異常信息:{}"); 
  34.     } 
  • logStart()方法:MathHandler類的add()方法運(yùn)行之前運(yùn)行。
  • logEnd()方法:MathHandler類的add()方法運(yùn)行結(jié)束之后運(yùn)行。
  • logReturn()方法:MathHandler類的add()方法正常返回之后運(yùn)行。
  • logException()方法:MathHandler類的add()方法拋出異常后執(zhí)行。

4.將目標(biāo)類和切面類加入到IOC容器

在io.mykit.spring.plugins.register.config包中,新建AopConfig類,并使用@Configuration注解標(biāo)注這是一個(gè)Spring的配置類,同時(shí)使用@EnableAspectJAutoProxy注解開啟基于注解的AOP模式。在AopConfig類中,使用@Bean注解將MathHandler類和LogAspect類加入到IOC容器中,如下所示。

 
 
 
 
  1. package io.mykit.spring.plugins.register.config; 
  2. import io.mykit.spring.plugins.register.aop.MathHandler; 
  3. import io.mykit.spring.plugins.register.aspect.LogAspect; 
  4. import org.springframework.context.annotation.Bean; 
  5. import org.springframework.context.annotation.Configuration; 
  6. import org.springframework.context.annotation.EnableAspectJAutoProxy; 
  7. /** 
  8.  * @author binghe 
  9.  * @version 1.0.0 
  10.  * @description 測(cè)試AOP 
  11.  */ 
  12. @Configuration 
  13. @EnableAspectJAutoProxy 
  14. public class AopConfig { 
  15.      
  16.     @Bean 
  17.     public MathHandler mathHandler(){ 
  18.         return new MathHandler(); 
  19.     } 
  20.  
  21.     @Bean 
  22.     public LogAspect logAspect(){ 
  23.         return new LogAspect(); 
  24.     } 

5.創(chuàng)建測(cè)試類

在 io.mykit.spring.test包中創(chuàng)建AopTest測(cè)試類,并在AopTest類中創(chuàng)建testAop01()方法,如下所示。

 
 
 
 
  1. package io.mykit.spring.test; 
  2. import io.mykit.spring.plugins.register.aop.MathHandler; 
  3. import io.mykit.spring.plugins.register.config.AopConfig; 
  4. import org.junit.Test; 
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
  6. /** 
  7.  * @author binghe 
  8.  * @version 1.0.0 
  9.  * @description 測(cè)試切面 
  10.  */ 
  11. public class AopTest { 
  12.  
  13.     @Test 
  14.     public void testAop01(){ 
  15.         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); 
  16.         MathHandler mathHandler = context.getBean(MathHandler.class); 
  17.         mathHandler.add(1, 2); 
  18.         context.close(); 
  19.     } 

運(yùn)行AopTest類中的testAop01()方法,輸出的結(jié)果信息如下所示。

 
 
 
 
  1. 加法運(yùn)行開始,參數(shù)列表是:{} 
  2. 目標(biāo)方法執(zhí)行 
  3. 加法運(yùn)行結(jié)束 
  4. 加法正常返回,運(yùn)行結(jié)果:{} 

可以看到,執(zhí)行了切面類中的方法,并打印出了相關(guān)信息。但是沒(méi)有打印參數(shù)列表和運(yùn)行結(jié)果。

6.在切面類中打印參數(shù)列表和返回結(jié)果

那如果需要打印出參數(shù)列表和運(yùn)行結(jié)果,該怎么辦呢?別急,我們繼續(xù)往下看。

要想打印出參數(shù)列表和運(yùn)行結(jié)果,就需要對(duì)LogAspect類中的方法進(jìn)行優(yōu)化,優(yōu)化后的結(jié)果如下所示。

 
 
 
 
  1. package io.mykit.spring.plugins.register.aspect; 
  2.  
  3. import org.aspectj.lang.JoinPoint; 
  4. import org.aspectj.lang.annotation.*; 
  5. import java.util.Arrays; 
  6. /** 
  7.  * @author binghe 
  8.  * @version 1.0.0 
  9.  * @description 打印日志的切面類 
  10.  */ 
  11. @Aspect 
  12. public class LogAspect { 
  13.  
  14.     @Pointcut("execution(public int io.mykit.spring.plugins.register.aop.MathHandler.*(..))") 
  15.     public void pointCut(){ 
  16.  
  17.     } 
  18.  
  19.     @Before("pointCut()") 
  20.     public void logStart(JoinPoint joinPoint){ 
  21.         System.out.println(joinPoint.getSignature().getName() + " 運(yùn)行開始,參數(shù)列表是:{"+ Arrays.asList(joinPoint.getArgs()) +"}"); 
  22.     } 
  23.  
  24.     @After("pointCut()") 
  25.     public void logEnd(JoinPoint joinPoint){ 
  26.         System.out.println(joinPoint.getSignature().getName() + " 運(yùn)行結(jié)束"); 
  27.     } 
  28.  
  29.     @AfterReturning(value = "pointCut()", returning = "result") 
  30.     public void logReturn(JoinPoint joinPoint, Object result){ 
  31.         System.out.println(joinPoint.getSignature().getName() + " 正常返回,運(yùn)行結(jié)果:{"+result+"}"); 
  32.     } 
  33.  
  34.     @AfterThrowing(value = "pointCut()", throwing = "exception") 
  35.     public void logException(JoinPoint joinPoint, Exception exception){ 
  36.         System.out.println(joinPoint.getSignature().getName() + " 異常,異常信息:{"+exception+"}"); 
  37.     } 

這里,需要注意的是:JoinPoint參數(shù)一定要放在參數(shù)的第一位。

此時(shí),我們?cè)俅芜\(yùn)行AopTest類中的testAop01()方法,輸出的結(jié)果信息如下所示。

 
 
 
 
  1. add 運(yùn)行開始,參數(shù)列表是:{[1, 2]} 
  2. 目標(biāo)方法執(zhí)行 
  3. add 運(yùn)行結(jié)束 
  4. add 正常返回,運(yùn)行結(jié)果:{3} 

7.目標(biāo)方法拋出異常

我們?cè)贛athHandler類的add()方法中拋出一個(gè)異常,來(lái)測(cè)試下異常情況,如下所示。

 
 
 
 
  1. package io.mykit.spring.plugins.register.aop; 
  2.  
  3. /** 
  4.  * @author binghe 
  5.  * @version 1.0.0 
  6.  * @description 定義一個(gè)數(shù)據(jù)處理器類,用于測(cè)試AOP 
  7.  */ 
  8. public class MathHandler { 
  9.  
  10.     public int add(int i, int j){ 
  11.         System.out.println("目標(biāo)方法執(zhí)行"); 
  12.         throw new RuntimeException(); 
  13.        //return i + j; 
  14.     } 

此時(shí),我們?cè)俅芜\(yùn)行AopTest類中的testAop01()方法,輸出的結(jié)果信息如下所示。

 
 
 
 
  1. add 運(yùn)行開始,參數(shù)列表是:{[1, 2]} 
  2. 目標(biāo)方法執(zhí)行 
  3. add 運(yùn)行結(jié)束 
  4. add 異常,異常信息:{java.lang.RuntimeException} 

可以看到,正確的輸出了切面中打印的信息。

至此,我們的AOP測(cè)試環(huán)境就搭建成功了。

本文轉(zhuǎn)載自微信公眾號(hào)「冰河技術(shù)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系冰河技術(shù)公眾號(hào)。


文章標(biāo)題:你敢信?面試官竟然讓我現(xiàn)場(chǎng)搭建一個(gè)AOP測(cè)試環(huán)境!
網(wǎng)站地址:http://www.5511xx.com/article/coepsis.html