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

詳解Spring AOP的實現(xiàn)方式

 更新時間:2024年02月19日 14:17:27   作者:Roylelele  
AOP是一種思想,是對某一類事情的集中處理,切面就是指某一類特定的問題,所以AOP可以理解為面向特定方法編程,這篇文章主要介紹了Spring AOP的實現(xiàn)方式,需要的朋友可以參考下

AOP基本概念

Spring框架的兩大核心:IoC和AOP

AOP:Aspect Oriented Programming(面向切面編程)

           AOP是一種思想,是對某一類事情的集中處理

面向切面編程:切面就是指某一類特定的問題,所以AOP可以理解為面向特定方法編程

舉例:攔截器是AOP的一種應(yīng)用

“特定問題”:登錄校驗

針對特定問題統(tǒng)一處理:登錄校驗攔截器

Spring對AOP進行了實現(xiàn),并且提供了一些API,就是Spring AOP

AOP的作用:

攔截器作用的維度是URL(?次請求和響應(yīng)), @ControllerAdvice 應(yīng)用 場景主要是全局異常處理 (配合自定義異常效果更佳), 數(shù)據(jù)綁定, 數(shù)據(jù)預(yù)處理。 AOP作用的維度更加細致(可以根據(jù)包、類、方法名、參數(shù)等進行攔截), 能夠?qū)崿F(xiàn)更加復(fù)雜的業(yè)務(wù)邏輯。

AOP開發(fā)步驟

舉例:往之前的圖書管理系統(tǒng)中創(chuàng)建一個切面aspect,打印每個接口的耗時。

引入AOP依賴

在pom.xml文件中添加配置

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

編寫AOP程序

打印每個接口的耗時

@Component//交給Spring管理
@Slf4j//打印日志
@Aspect//表明改類為切面
public class TimeAspect {
    // @Around定義哪些是目標(biāo)方法
    @Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")
    public Object timeCost(ProceedingJoinPoint joinPoint) throws Throwable {
        //ProceedingJoinPoint表示作用的目標(biāo)方法
        long start=System.currentTimeMillis();
        //執(zhí)行目標(biāo)方法
       Object result=joinPoint.proceed();
        long end=System.currentTimeMillis();
        log.info(joinPoint+"消耗時間:"+(end-start)+"ms");
        return result;
    }
}

通過上面的程序, 我們也可以感受到AOP面向切面編程的?些優(yōu)勢:

• 代碼無侵入: 不修改原始的業(yè)務(wù)方法, 就可以對原始的業(yè)務(wù)方法進行功能的增強或者是功能的改變

• 減少了重復(fù)代碼

• 提高開發(fā)效率

• 維護方便

AOP詳解

1.切點:切入點 ,一組規(guī)則,通過表達式來描述

@Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")

2.連接點:目標(biāo)方法就是連接點;切點描述的方法

圖書管理系統(tǒng)中controller下的所有方法(add、delete.....)

3.通知:具體的邏輯,要做的處理

4.切面:切點+通知

通知(advice)

Spring中AOP的通知類型有以下幾種:

• @Around: 環(huán)繞通知, 此注解標(biāo)注的通知方法在目標(biāo)方法前, 后都被執(zhí)行

• @Before: 前置通知, 此注解標(biāo)注的通知方法在目標(biāo)方法前被執(zhí)行 

• @After: 后置通知, 此注解標(biāo)注的通知方法在目標(biāo)方法后被執(zhí)行, 無論是否有異常都會執(zhí)行

• @AfterReturning: 返回后通知, 此注解標(biāo)注的通知方法在目標(biāo)方法后被執(zhí)行, 有異常不會執(zhí)行 

• @AfterThrowing: 異常后通知, 此注解標(biāo)注的通知方法發(fā)生異常后執(zhí)行  

簡單做一個測試:

測試結(jié)果:

先執(zhí)行around,再執(zhí)行before;先執(zhí)行after,再執(zhí)行around

當(dāng)添加一個異常的接口,執(zhí)行異常接口的時候,觀察控制臺的順序:

切點

@PointCut

當(dāng)有多個切面的時候,切面的執(zhí)行順序按照名稱進行排序。但觀察比較麻煩,下面介紹切面優(yōu)先級。

切面優(yōu)先級(@Order)

當(dāng)我們在?個項目中, 定義了多個切面類時, 并且這些切面類的多個切入點都匹配到了同?個目標(biāo)方法. 當(dāng)目標(biāo)方法運行的時候,運行順序不方便管理。

Spring 給我們提供了一個新的注解, 來控制這些切面通知的執(zhí)行順序:@Order

使用@Order時,數(shù)字越小,優(yōu)先級越高

切點表達式

切點表達式常見有兩種表達?式

1. execution(RR):根據(jù)方法的簽名來匹配

2. @annotation(RR) :根據(jù)注解匹配

execution表達式

execution(<訪問修飾符> <返回類型> <包名.類名.?法(?法參數(shù))> <異常>)

訪問修飾符和異??梢允÷?/p>

//切點表達式?例 
//TestController 下的 public修飾, 返回類型為String ?法名為t1, ?參?法 
    execution(public String com.example.demo.controller.TestController.t1())
//省略訪問修飾符 
    execution(String com.example.demo.controller.TestController.t1()) 
//匹配所有返回類型 
    execution(* com.example.demo.controller.TestController.t1())
//匹配TestController 下的所有?參?法 
    execution(* com.example.demo.controller.TestController.*()) 
//匹配TestController 下的所有?法
    execution(* com.example.demo.controller.TestController.*(..)) 
//匹配controller包下所有的類的所有?法 
    execution(* com.example.demo.controller.*.*(..)) 
//匹配所有包下?的TestController 
    execution(* com..TestController.*(..))
//匹配com.example.demo包下, ?孫包下的所有類的所有?法
    execution(* com.example.demo..*(..))

@annotation注解匹配

execution表達式更適用有規(guī)則的, 如果我們要匹配多個無規(guī)則的方法時, 例如:TestController中的t1() 和UserController中的u1()這兩個方法.

這個時候使用execution這種切點表達式來描述比較麻煩。

此時使用@annotation 來描述這一類的切點

實現(xiàn)步驟:

1. 編寫自定義注解

2. 使用@annotation 表達式來描述切點

3. 在連接點的方法上添加自定義注解

1. 編寫自定義注解

2. 使用@annotation 表達式來描述切點

3. 在連接點的方法上添加自定義注解

此時只有執(zhí)行h1和t2時,控制臺才會出現(xiàn)對切點的描述

到此這篇關(guān)于Spring AOP的實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Spring AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rxjava+Retrofit+MVP實現(xiàn)購物車功能

    Rxjava+Retrofit+MVP實現(xiàn)購物車功能

    這篇文章主要為大家詳細介紹了Rxjava+Retrofit+MVP實現(xiàn)購物車功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • java獲取ip地址示例

    java獲取ip地址示例

    在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實IP地址了
    2014-04-04
  • SpringBoot多環(huán)境下集成logback的配置指南

    SpringBoot多環(huán)境下集成logback的配置指南

    Logback是由log4j創(chuàng)始人設(shè)計的又一個開源日志組件,可用于項目日志功能,下面小編就來和大家詳細介紹一下SpringBoot如何在多環(huán)境下集成logback吧
    2026-02-02
  • Spring框架 XML配置事務(wù)控制的步驟操作

    Spring框架 XML配置事務(wù)控制的步驟操作

    這篇文章主要介紹了Spring框架 XML配置事務(wù)控制的步驟操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中不用第三個變量來互換兩個變量的值

    Java中不用第三個變量來互換兩個變量的值

    在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應(yīng)用程序會將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個內(nèi)存單元都用一個標(biāo)識符來標(biāo)識。這些內(nèi)存單元被稱為變量,定義的標(biāo)識符就是變量名,內(nèi)存單元中存儲的數(shù)據(jù)就是變量的值
    2021-10-10
  • Idea打不了斷點如何解決

    Idea打不了斷點如何解決

    這篇文章主要介紹了Idea打不了斷點如何解決的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個簡單的客戶選購系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-10-10
  • Java實現(xiàn)辦公文檔在線預(yù)覽功能

    Java實現(xiàn)辦公文檔在線預(yù)覽功能

    java實現(xiàn)辦公文件在線預(yù)覽功能是一個大家在工作中也許會遇到的需求,這篇文章就教大家如何實現(xiàn)這一功能,感興趣的小伙伴可以了解一下
    2021-12-12
  • Java Scanner類的使用示例

    Java Scanner類的使用示例

    這篇文章主要介紹了Java Scanner類的使用示例,幫助大家更好的理解和學(xué)習(xí)java,感興趣的朋友可以了解下
    2020-08-08
  • Java中String類常用方法詳細匯總

    Java中String類常用方法詳細匯總

    Java中String類在所有項目開發(fā)里面一定會用到,因此String類提供了一系列的功能操作方法,下面這篇文章主要給大家介紹了關(guān)于Java中String類常用方法的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評論

常宁市| 建湖县| 陕西省| 金门县| 德保县| 陆良县| 甘德县| 肥城市| 两当县| 平泉县| 嘉荫县| 赤壁市| 龙陵县| 中宁县| 武乡县| 阜城县| 肃宁县| 漳浦县| 临潭县| 丰城市| 得荣县| 岢岚县| 玉门市| 曲靖市| 新昌县| 通州区| 贵南县| 乾安县| 东乡县| 苏尼特左旗| 白朗县| 镇安县| 胶州市| 新田县| 隆尧县| 榆中县| 盐池县| 莱芜市| 广德县| 临漳县| 喀什市|