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

Spring AOP基本概念

 更新時間:2021年07月16日 11:13:00   作者:寧在春  
這篇文章主要為大家詳細介紹了spring基礎(chǔ)概念A(yù)OP與動態(tài)代理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助

舉個栗子給大家講一下代理:

我相信大家都知道明星吧。

大部分明星是都有經(jīng)紀人的。

假如我們是一個大廠,現(xiàn)在想要找一個明星代理產(chǎn)品,那我們會直接找到明星嗎?不?,F(xiàn)實中,你大部分找到的都是找到明星的代理人(經(jīng)紀人)。經(jīng)紀人通過和你約談,了解產(chǎn)品,看自己的家明星,是否可以接下這個廣告。覺得可以,就會和你商量簽訂合同、商談活動日期、排練等等。 雖然商家知道自己并沒有找到明星,但是他卻知道這件事情已經(jīng)成了。

1、在這個流程中,商家找了明星的經(jīng)紀人。但是卻完成了最初的任務(wù)。

2、明星經(jīng)紀人 幫明星簽訂合同、訂下活動日期等等。

3、明星專注于拍廣告。

這個時候我們是不是就可以講 明星經(jīng)紀人增強了明星的功能勒?

什么是AOP?

與OOP對比,AOP是處理一些橫切行問題。這些橫切性問題不會影響到主邏輯的實現(xiàn),但是會散落到代碼的各個部分,難以維護。AOP就是把這些問題和主業(yè)務(wù)邏輯分開,達到與主業(yè)務(wù)邏輯解耦的目的。

AOP是一種面向切面的編程思想。這些橫切性問題,把它們抽象為一個切面,關(guān)注點在切面的編程,這就是所謂的AOP。

AOP關(guān)注點是橫切性問題:

基本術(shù)語

(1)切面(Aspect)

跨越多個類的關(guān)注點的模塊化。事務(wù)管理是Java 應(yīng)用程序中橫切關(guān)注點的一個很好的例子。在 Spring AOP 中,方面是通過使用常規(guī)類(基于模式的方法)或使用@Aspect注解注解的常規(guī)類 (@AspectJ 風格)實現(xiàn)的。

切面是一個橫切關(guān)注點的模塊化,一個切面能夠包含同一個類型的不同增強方法,比如說事務(wù)處理和日志處理可以理解為兩個切面。切面由切入點和通知組成,它既包含了橫切邏輯的定義,也包括了切入點的定義。 Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的連接點中。

可以簡單地認為, 使用 @Aspect 注解的類就是切面

(2) 目標對象(Target)

目標對象指將要被增強的對象,即包含主業(yè)務(wù)邏輯的類對象?;蛘哒f是被一個或者多個切面所通知的對象。

(3) 連接點(JoinPoint)

程序執(zhí)行過程中明確的點,如方法的調(diào)用或特定的異常被拋出。連接點由兩個信息確定:

  • 方法(表示程序執(zhí)行點,即在哪個目標方法)
  • 相對點(表示方位,即目標方法的什么位置,比如調(diào)用前,后等)

簡單來說,連接點就是被攔截到的程序執(zhí)行點,因為Spring只支持方法類型的連接點,所以在Spring中連接點就是被攔截到的方法。

講人話 就是spring允許你使用通知的地方

(4) 切入點(PointCut)

上面說的連接點的基礎(chǔ)上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你并不想在所有方法附近都使用通知(使用叫織入,以后再說),你只想讓其中的幾個,在調(diào)用這幾個方法之前,之后或者拋出異常時干點什么,那么就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。

@Pointcut("execution(* com.remcarpediem.test.aop.service..*(..))")
public void pointcut() {
}

上邊切入點的匹配規(guī)則是com.remcarpediem.test.aop.service包下的所有類的所有函數(shù)。

(5) 通知(Advice)

Spring AOP 包括以下類型的通知:

  • 前通知(Before advice):在連接點之前運行的通知,但沒有能力阻止執(zhí)行流繼續(xù)到連接點(除非它拋出異常)。
  • 返回后通知(After returning advice):在連接點正常完成后運行的通知(例如,如果方法返回而沒有拋出異常)。
  • 拋出異常通知后(After throwing advice):如果方法通過拋出異常退出,則運行通知。
  • After (finally) 通知(After (finally) advice):不管連接點退出的方式(正?;虍惓7祷兀┒紝⑦\行的通知。
  • 環(huán)繞通知(Around advice):環(huán)繞連接點的通知,例如方法調(diào)用。這是最有力的建議。環(huán)繞通知可以在方法調(diào)用前后執(zhí)行自定義行為。它還負責選擇是繼續(xù)連接點還是通過返回自己的返回值或拋出異常來縮短建議的方法執(zhí)行。
// @Before說明這是一個前置通知,log函數(shù)中是要前置執(zhí)行的代碼,JoinPoint是連接點,
@Before("pointcut()")
public void log(JoinPoint joinPoint) { 
}

(6) 織入(Weaving)

織入是將切面和業(yè)務(wù)邏輯對象連接起來, 并創(chuàng)建通知代理的過程??椚肟梢栽诰幾g時,類加載時和運行時完成。在編譯時進行織入就是靜態(tài)代理,而在運行時進行織入則是動態(tài)代理。

關(guān)鍵就是:切點定義了哪些連接點會得到通知

靜態(tài)代理模式

所謂靜態(tài)代理就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強。ApsectJ是靜態(tài)代理的實現(xiàn)之一,也是最為流行的。靜態(tài)代理由于在編譯時就生成了代理類,效率相比動態(tài)代理要高一些。AspectJ可以單獨使用,也可以和Spring結(jié)合使用。

動態(tài)代理模式

與靜態(tài)代理不同,動態(tài)代理就是說AOP框架不會去修改編譯時生成的字節(jié)碼,而是在運行時在內(nèi)存中生成一個AOP代理對象,這個AOP對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調(diào)原對象的方法。

Spring AOP中的動態(tài)代理主要有兩種方式:JDK動態(tài)代理和CGLIB動態(tài)代理。

JDK代理通過反射來處理被代理的類,并且要求被代理類必須實現(xiàn)一個接口。核心類是 InvocationHandler接口 和 Proxy類。

而當目標類沒有實現(xiàn)接口時,Spring AOP框架會使用CGLIB來動態(tài)代理目標類。 

CGLIB(Code Generation Library),是一個代碼生成的類庫,可以在運行時動態(tài)的生成某個類的子類。CGLIB是通過繼承的方式做的動態(tài)代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態(tài)代理的。核心類是 MethodInterceptor 接口和Enhancer 類

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中的Map集合簡單匯總解析

    Java中的Map集合簡單匯總解析

    這篇文章主要介紹了Java中的Map集合簡單匯總解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Spring Data + Thymeleaf 3 + Bootstrap 4 實現(xiàn)分頁器實例代碼

    Spring Data + Thymeleaf 3 + Bo

    本篇文章主要介紹了Spring Data + Thymeleaf 3 + Bootstrap 4 實現(xiàn)分頁器實例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • HttpServletRequest對象方法的用法小結(jié)

    HttpServletRequest對象方法的用法小結(jié)

    HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協(xié)議訪問服務(wù)器時,HTTP請求頭中的所有信息都封裝在這個對象中,開發(fā)人員通過這個對象的相關(guān)方法,即可以獲得客戶的這些信息
    2017-03-03
  • 關(guān)于springboot響應(yīng)式編程整合webFlux的問題

    關(guān)于springboot響應(yīng)式編程整合webFlux的問題

    在springboot2.x版本中提供了webFlux依賴模塊,該模塊有兩種模型實現(xiàn):一種是基于功能性端點的方式,另一種是基于SpringMVC注解方式,今天通過本文給大家介紹springboot響應(yīng)式編程整合webFlux的問題,感興趣的朋友一起看看吧
    2022-01-01
  • Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet

    這篇文章主要介紹了Java?中很好用的數(shù)據(jù)結(jié)構(gòu)EnumSet,EnumMap即屬于一個Map,下文圍繞主題展開詳細內(nèi)容,需要的小伙伴可以參考參考一下
    2022-05-05
  • SpringBoot中優(yōu)化Undertow性能的方法總結(jié)

    SpringBoot中優(yōu)化Undertow性能的方法總結(jié)

    Undertow是一個采用 Java 開發(fā)的靈活的高性能Web服務(wù)器,提供包括阻塞和基于NIO的非堵塞機制,本文將給大家介紹SpringBoot中優(yōu)化Undertow性能的方法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)

    Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)

    普通的隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭刪除。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先刪除。優(yōu)先隊列具有最高級先出 (first in, largest out)的行為特征。通常采用堆數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)
    2022-01-01
  • Spring數(shù)據(jù)訪問模板化方法

    Spring數(shù)據(jù)訪問模板化方法

    今天小編就為大家分享一篇關(guān)于Spring數(shù)據(jù)訪問模板化,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java實現(xiàn)五子棋游戲

    Java實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • BigDecimal的toString()、toPlainString()和toEngineeringString()區(qū)別及用法詳解

    BigDecimal的toString()、toPlainString()和toEngineeringString()區(qū)

    使用BigDecimal進行打印的時候,經(jīng)常會對BigDecimal提供的三個toString方法感到好奇,以下整理3個toString方法的區(qū)別及用法,需要的朋友可以參考下
    2023-08-08

最新評論

涪陵区| 金乡县| 化州市| 南川市| 卓资县| 金平| 社会| 东宁县| 海口市| 宜章县| 常宁市| 黄冈市| 平武县| 巧家县| 南部县| 邓州市| 顺昌县| 彭山县| 池州市| 利津县| 蒙阴县| 宜兰县| 健康| 娱乐| 上思县| 普兰县| 黄大仙区| 保定市| 特克斯县| 柳河县| 韩城市| 宁河县| 大英县| 基隆市| 平安县| 广州市| 土默特左旗| 高陵县| 饶平县| 金湖县| 天等县|