欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?AOP中的環(huán)繞通知詳解

 更新時間:2024年07月05日 14:38:32   作者:從零開始的-CodeNinja之路  
AOP是一種思想,是對某一類事情的集中處理,接下來我們要學習的是運用了AOP思想,進行AOP的環(huán)繞處理,本文通過實例講解Spring?AOP中的環(huán)繞通知,感興趣的朋友一起看看吧

一、什么是AOP?

Aspect Oriented Programming(面向切面編程)

AOP是Spring框架的第??核?(第??核?是IoC)

AOP是一種思想,是對某一類事情的集中處理。
其中在下面的學習中我們會學習到攔截器、統(tǒng)一異常處理,統(tǒng)一結果處理等,這些都是運用了AOP的統(tǒng)一思想來實現(xiàn)的。

攔截器實現(xiàn)AOP思想作用的維度是前端對后端進行的一次請求和一次響應,主要是檢索前端傳來的URL,如果檢索后返回True,則可以進入Controller開始執(zhí)行代碼,如果返回的為False,則表示失敗,直接被攔截在外面,無法執(zhí)行代碼。

統(tǒng)一結果處理則是使用注解@ControllerAdvice(通知類注解),實現(xiàn)ResponseBodyAdvice接口,對響應的結果進行統(tǒng)一處理,對齊進行統(tǒng)一的包裝后響應,其中如果數(shù)據(jù)類型為String類型的話要進行特殊處理,使用ObjectMapper的方法將String格式轉為Json格式再次響應。

統(tǒng)一異常處理也是使用注解@ControllerAdvice(通知類注解),以及在方法上使用@ExceptionHandler注解,在全部的程序中如果遇到運行時異常則會自動捕捉,進行拋出,注:編譯時異常是寫代碼過程中出現(xiàn)的,不手動解決就無法運行程序。

接下來我們要學習的是運用了AOP思想,進行AOP的環(huán)繞處理

二、AOP 的環(huán)繞通知

2.1 切點以及切點表達式

切點=通知類型+切點表達式
切點表示了為該方法提供一組規(guī)則,來對程序進行功能增強

通知類型有以下5種:

@Around:環(huán)繞通知,此注解標注的通知方法在目標方法前,后都被執(zhí)行
@Before:前置通知,此注解標注的通知方法在目標方法前被執(zhí)行
@After:后置通知,此注解標注的通知方法在目標方法后被執(zhí)行,?論是否有異常都會執(zhí)行
@AfterReturning:返回后通知,此注解標注的通知方法在目標方法后被執(zhí)行,有異常不會執(zhí)行
@AfterThrowing:異常后通知,此注解標注的通知方法發(fā)?異常后執(zhí)行

如下圖所示:

在該方法上的@Around,表示的是環(huán)繞處理,是一種通知類型
其后面的execution(* com.example.demo.controller..(…)) 表示的是該通知類型作用的范圍,是切點表達式

2.2 連接點

滿足切點表達式規(guī)則的方法就是連接點

在該圖中,public recordTime方法就是連接點

2.3 通知(Advice)

通知就是具體要做的內容,簡單來說就是方法內執(zhí)行的代碼內容

如圖所示:

該圖中標紅的位置就是通知內容,在AOP面向切面編程當中,我們把這部分重復的代碼邏輯抽取出來單獨定義,這部分代碼就是通知的內容

2.4 切面(Aspect)

首先使用注解@Aspect來表示該類是一個切面類
然后使用不同的通知類型進行處理,如圖表示的是環(huán)繞通知類型
在處理過程中ProceedingJoinPoint.proceed()讓原始方法執(zhí)行

切面(Aspect)=切點(Pointcut)+通知(Advice)
以下代碼表示一個完整的切面類:

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class TimeAspect {
	/**
	* 記錄方法耗時
	*/
	@Around("execution(* com.example.demo.controller.*.*(..))")
	public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
		//記錄方法執(zhí)行開始時間
		long begin = System.currentTimeMillis();
		//執(zhí)行原始方法
		Object result = pjp.proceed();
		//記錄方法執(zhí)行結束時間
		long end = System.currentTimeMillis();
		//記錄方法執(zhí)行耗時
		log.info(pjp.getSignature() + "執(zhí)行耗時: {}ms", end - begin);
		return result;
	}
}

2.5 不同通知類型的區(qū)別

2.5.1 正常情況下

環(huán)繞通知 @Around 標識的通知方法包含兩部分,?個"前置邏輯",?個"后置邏輯".其
中"前置邏輯"會先于 @Before 標識的通知方法執(zhí)行,"后置邏輯"會晚于 @After 標識的通知方法執(zhí)行

2.5.2異常情況下

程序發(fā)?異常的情況下:
• @AfterReturning 標識的通知方法不會執(zhí)行, @AfterThrowing 標識的通知方法執(zhí)行了
• @Around 環(huán)繞通知中原始方法調?時有異常,通知中的環(huán)繞后的代碼邏輯也不會在執(zhí)行了(因為
原始方法調?出異常了)

注意事項:
• @Around 環(huán)繞通知需要調? ProceedingJoinPoint.proceed() 來讓原始方法執(zhí)行,其他
通知不需要考慮目標方法執(zhí)行.
• @Around 環(huán)繞通知方法的返回值,必須指定為Object,來接收原始方法的返回值,否則原始方法執(zhí)
行完畢,是獲取不到返回值的.
• ?個切面類可以有多個切點

2.6 統(tǒng)一管理切點@PointCut

• @Around 環(huán)繞通知需要調? ProceedingJoinPoint.proceed() 來讓原始方法執(zhí)行,其他
通知不需要考慮目標方法執(zhí)行.
• @Around 環(huán)繞通知方法的返回值,必須指定為Object,來接收原始方法的返回值,否則原始方法執(zhí)
行完畢,是獲取不到返回值的.
• ?個切面類可以有多個切點

本類使用注解后的切點表達式代碼如下:

@Slf4j
@Aspect
@Component
public class AspectDemo {
		//定義切點(公共的切點表達式)
		@Pointcut("execution(* com.example.demo.controller.*.*(..))")
		private void pt(){}
		//前置通知
		@Before("pt()")
		public void doBefore() {
		//...代碼省略
		}
		//后置通知
		@After("pt()")
		public void doAfter() {
		//...代碼省略
		}
		//返回后通知
		@AfterReturning("pt()")
		public void doAfterReturning() {
		//...代碼省略
		}
		//拋出異常后通知
		@AfterThrowing("pt()")
		public void doAfterThrowing() {
		//...代碼省略
		}
		//添加環(huán)繞通知
		@Around("pt()")
		public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
		//...代碼省略
	}
}

在其他類中調用該切點表達式代碼如下:

@Slf4j
@Aspect
@Component
	public class AspectDemo2 {
		//前置通知
		@Before("com.example.demo.aspect.AspectDemo.pt()")
		public void doBefore() {
		log.info("執(zhí)行 AspectDemo2 -> Before 方法");
	}
}```
當切點定義使?private修飾時,僅能在當前切面類中使?,當其他切面類也要使?當前切點定義時,就需要把private改為public.引?方式為:全限定類名.方法名()
### 2.7     切面優(yōu)先級@Order
在切面類中會有多個切點同時匹配成功,那么該如何進行執(zhí)行順序呢?
應該使用注解@Order(數(shù)字)來表示優(yōu)先級順序
@Order注解標識的切面類,執(zhí)行順序如下:
? @Before 通知:數(shù)字越?先執(zhí)行
? @After 通知:數(shù)字越?先執(zhí)行
@Order 控制切面的優(yōu)先級,先執(zhí)行優(yōu)先級較?的切面,再執(zhí)行優(yōu)先級較低的切面,最終執(zhí)行目標方法.

到此這篇關于Spring AOP中的環(huán)繞通知的文章就介紹到這了,更多相關Spring AOP環(huán)繞通知內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot3 RestTemplate配置與使用詳解

    SpringBoot3 RestTemplate配置與使用詳解

    本文詳細介紹了在 SpringBoot 3.x 中如何配置和使用 RestTemplate,包括基本配置、高級配置以及各種使用場景,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java網(wǎng)絡編程之基于TCP協(xié)議

    Java網(wǎng)絡編程之基于TCP協(xié)議

    本文主要將Java基于TCP的網(wǎng)絡編程主要分解成5個功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請求,需要的朋友可以參考下
    2021-05-05
  • Autowired的注入過程源碼解析

    Autowired的注入過程源碼解析

    這篇文章主要為大家介紹了Autowired的注入過程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java實現(xiàn)ArrayList排序的方法詳解

    Java實現(xiàn)ArrayList排序的方法詳解

    Java中常見的ArrayList排序方法主要為三種:JDK8的stream、Comparator#compare()和Comparable#compareTo(),本文將詳解這三者的使用,需要的可以參考一下
    2022-05-05
  • 解析SpringBoot @EnableAutoConfiguration的使用

    解析SpringBoot @EnableAutoConfiguration的使用

    這篇文章主要介紹了解析SpringBoot @EnableAutoConfiguration的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    Spring AMQP作為Spring框架的一部分,是一套用于支持高級消息隊列協(xié)議(AMQP)的工具,AMQP是一種強大的消息協(xié)議,旨在支持可靠的消息傳遞,本文給大家介紹了如何基于Spring AMQP實現(xiàn)消息隊列,需要的朋友可以參考下
    2024-03-03
  • Mybatis-Plus 通用CRUD的詳細操作

    Mybatis-Plus 通用CRUD的詳細操作

    這篇文章主要介紹了Mybatis-Plus 通用CRUD的詳細操作,包括插入操作,更新操作及刪除操作等,針對每種操作通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • java 裝飾模式(Decorator Pattern)詳解及實例代碼

    java 裝飾模式(Decorator Pattern)詳解及實例代碼

    裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現(xiàn)有的類的一個包裝
    2016-10-10
  • Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld

    Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld

    這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld的實現(xiàn)過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • mybatis-plus3.4.0邏輯刪除報錯的解決

    mybatis-plus3.4.0邏輯刪除報錯的解決

    這篇文章主要介紹了mybatis-plus3.4.0邏輯刪除報錯的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11

最新評論