最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、什么是AOP?

Aspect Oriented Programming(面向切面編程)

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

AOP是一種思想,是對(duì)某一類事情的集中處理。
其中在下面的學(xué)習(xí)中我們會(huì)學(xué)習(xí)到攔截器、統(tǒng)一異常處理,統(tǒng)一結(jié)果處理等,這些都是運(yùn)用了AOP的統(tǒng)一思想來(lái)實(shí)現(xiàn)的。

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

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

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

接下來(lái)我們要學(xué)習(xí)的是運(yùn)用了AOP思想,進(jìn)行AOP的環(huán)繞處理

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

2.1 切點(diǎn)以及切點(diǎn)表達(dá)式

切點(diǎn)=通知類型+切點(diǎn)表達(dá)式
切點(diǎn)表示了為該方法提供一組規(guī)則,來(lái)對(duì)程序進(jìn)行功能增強(qiáng)

通知類型有以下5種:

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

如下圖所示:

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

2.2 連接點(diǎn)

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

在該圖中,public recordTime方法就是連接點(diǎn)

2.3 通知(Advice)

通知就是具體要做的內(nèi)容,簡(jiǎn)單來(lái)說就是方法內(nèi)執(zhí)行的代碼內(nèi)容

如圖所示:

該圖中標(biāo)紅的位置就是通知內(nèi)容,在AOP面向切面編程當(dāng)中,我們把這部分重復(fù)的代碼邏輯抽取出來(lái)單獨(dú)定義,這部分代碼就是通知的內(nèi)容

2.4 切面(Aspect)

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

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

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 {
	/**
	* 記錄方法耗時(shí)
	*/
	@Around("execution(* com.example.demo.controller.*.*(..))")
	public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
		//記錄方法執(zhí)行開始時(shí)間
		long begin = System.currentTimeMillis();
		//執(zhí)行原始方法
		Object result = pjp.proceed();
		//記錄方法執(zhí)行結(jié)束時(shí)間
		long end = System.currentTimeMillis();
		//記錄方法執(zhí)行耗時(shí)
		log.info(pjp.getSignature() + "執(zhí)行耗時(shí): {}ms", end - begin);
		return result;
	}
}

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

2.5.1 正常情況下

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

2.5.2異常情況下

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

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

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

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

本類使用注解后的切點(diǎn)表達(dá)式代碼如下:

@Slf4j
@Aspect
@Component
public class AspectDemo {
		//定義切點(diǎn)(公共的切點(diǎn)表達(dá)式)
		@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 {
		//...代碼省略
	}
}

在其他類中調(diào)用該切點(diǎn)表達(dá)式代碼如下:

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

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

相關(guān)文章

  • 詳解JAVA 弱引用

    詳解JAVA 弱引用

    這篇文章主要介紹了 JAVA 弱引用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)java引用對(duì)象,感興趣的朋友可以了解下
    2020-08-08
  • spring rocketmq集成方案

    spring rocketmq集成方案

    本文詳細(xì)介紹了如何在Spring Boot項(xiàng)目中集成RocketMQ 5.x,包括前置條件、核心依賴、配置、生產(chǎn)者和消費(fèi)者實(shí)現(xiàn)、測(cè)試驗(yàn)證以及關(guān)鍵注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Java獲取請(qǐng)求url地址的幾種常見方法

    Java獲取請(qǐng)求url地址的幾種常見方法

    在 Java Web 應(yīng)用中,要拿到客戶端發(fā)過來(lái)的完整請(qǐng)求 URL,通常都是在 Servlet 或 Spring MVC 的控制器里,通過注入 HttpServletRequest 來(lái)獲取,下面給出幾種常見場(chǎng)景的示例,需要的朋友可以參考下
    2025-05-05
  • Java JDK 1.8 lambda的用法詳解

    Java JDK 1.8 lambda的用法詳解

    這篇文章主要介紹了Java JDK 1.8 lambda的用法詳解,文中給大家提到了jdk 1.8 Lambda 表達(dá)式 遍歷數(shù)組的方法,需要的朋友可以參考下
    2019-09-09
  • 淺談一下Java中的內(nèi)存模型JMM

    淺談一下Java中的內(nèi)存模型JMM

    這篇文章主要介紹了淺談一下Java中的內(nèi)存模型JMM,JMM,全程是?Java?Memory?Model?,直譯就是?Java?內(nèi)存模型,根據(jù)這個(gè)名字,可以知道它是?Java?設(shè)計(jì)用來(lái)管理內(nèi)存的一個(gè)模型,需要的朋友可以參考下
    2023-08-08
  • Effective Java 在工作中的應(yīng)用總結(jié)

    Effective Java 在工作中的應(yīng)用總結(jié)

    《Effective Java》是一本經(jīng)典的 Java 學(xué)習(xí)寶典,值得每位 Java 開發(fā)者閱讀。下面文章即是將書中和平日工作較密切的知識(shí)點(diǎn)做了部分總結(jié),需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的長(zhǎng)輪詢的示例代碼

    Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的長(zhǎng)輪詢的示例代碼

    長(zhǎng)輪詢是與服務(wù)器保持即時(shí)通信的最簡(jiǎn)單的方式,它不使用任何特定的協(xié)議,例如 WebSocket ,所以也不依賴于瀏覽器版本等外部條件的兼容性。本文將用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的長(zhǎng)輪詢,需要的可以參考一下
    2022-08-08
  • Java多線程事務(wù)回滾@Transactional失效處理方案

    Java多線程事務(wù)回滾@Transactional失效處理方案

    這篇文章主要介紹了Java多線程事務(wù)回滾@Transactional失效處理方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼

    java web項(xiàng)目實(shí)現(xiàn)文件下載實(shí)例代碼

    現(xiàn)在項(xiàng)目里面有個(gè)需求,需要把系統(tǒng)產(chǎn)生的日志文件給下載到本地 先獲取所有的日志文件列表,顯示到界面,選擇一個(gè)日志文件,把文件名傳到后臺(tái)
    2013-09-09
  • java輕量級(jí)規(guī)則引擎easy-rules使用介紹

    java輕量級(jí)規(guī)則引擎easy-rules使用介紹

    這篇文章主要介紹了java輕量級(jí)規(guī)則引擎easy-rules使用介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論

黄冈市| 连南| 拜泉县| 噶尔县| 桂东县| 盐山县| 论坛| 贵州省| 富宁县| 陆丰市| 柳州市| 莱西市| 子洲县| 文山县| 德保县| 甘孜| 甘孜| 茂名市| 平邑县| 商城县| 林周县| 察哈| 库尔勒市| 绥德县| 墨脱县| 高要市| 从化市| 五家渠市| 祁东县| 会理县| 特克斯县| 河北区| 张北县| 长白| 敦煌市| 景东| 宁蒗| 宣威市| 双牌县| 阿巴嘎旗| 昌平区|