您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring AOP的基本概念是什么”,在日常操作中,相信很多人在Spring AOP的基本概念是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring AOP的基本概念是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
舉個栗子給大家講一下代理:
什么是AOP?
基本術語
(1)切面(Aspect)
(2) 目標對象(Target)
(3) 連接點(JoinPoint)
(4) 切入點(PointCut)
(5) 通知(Advice)
(6) 織入(Weaving)
靜態代理模式
動態代理模式
我相信大家都知道明星吧。
大部分明星是都有經紀人的。
假如我們是一個大廠,現在想要找一個明星代理產品,那我們會直接找到明星嗎?不。現實中,你大部分找到的都是找到明星的代理人(經紀人)。經紀人通過和你約談,了解產品,看自己的家明星,是否可以接下這個廣告。覺得可以,就會和你商量簽訂合同、商談活動日期、排練等等。 雖然商家知道自己并沒有找到明星,但是他卻知道這件事情已經成了。
1、在這個流程中,商家找了明星的經紀人。但是卻完成了最初的任務。
2、明星經紀人 幫明星簽訂合同、訂下活動日期等等。
3、明星專注于拍廣告。
這個時候我們是不是就可以講 明星經紀人增強了明星的功能勒?
與OOP對比,AOP是處理一些橫切行問題。這些橫切性問題不會影響到主邏輯的實現,但是會散落到代碼的各個部分,難以維護。AOP就是把這些問題和主業務邏輯分開,達到與主業務邏輯解耦的目的。
AOP是一種面向切面的編程思想。這些橫切性問題,把它們抽象為一個切面,關注點在切面的編程,這就是所謂的AOP。
AOP關注點是橫切性問題:
跨越多個類的關注點的模塊化。事務管理是Java 應用程序中橫切關注點的一個很好的例子。在 Spring AOP 中,方面是通過使用常規類(基于模式的方法)或使用@Aspect
注解注解的常規類 (@AspectJ 風格)實現的。
切面是一個橫切關注點的模塊化,一個切面能夠包含同一個類型的不同增強方法,比如說事務處理和日志處理可以理解為兩個切面。切面由切入點和通知組成,它既包含了橫切邏輯的定義,也包括了切入點的定義。 Spring AOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入到切面所指定的連接點中。
可以簡單地認為, 使用 @Aspect 注解的類就是切面
目標對象指將要被增強的對象,即包含主業務邏輯的類對象。或者說是被一個或者多個切面所通知的對象。
程序執行過程中明確的點,如方法的調用或特定的異常被拋出。連接點由兩個信息確定:
方法(表示程序執行點,即在哪個目標方法)
相對點(表示方位,即目標方法的什么位置,比如調用前,后等)
簡單來說,連接點就是被攔截到的程序執行點,因為Spring只支持方法類型的連接點,所以在Spring中連接點就是被攔截到的方法。
講人話 就是spring允許你使用通知的地方
上面說的連接點的基礎上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你并不想在所有方法附近都使用通知(使用叫織入,以后再說),你只想讓其中的幾個,在調用這幾個方法之前,之后或者拋出異常時干點什么,那么就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。
@Pointcut("execution(* com.remcarpediem.test.aop.service..*(..))") public void pointcut() { }
上邊切入點的匹配規則是com.remcarpediem.test.aop.service
包下的所有類的所有函數。
Spring AOP 包括以下類型的通知:
前通知(Before advice):在連接點之前運行的通知,但沒有能力阻止執行流繼續到連接點(除非它拋出異常)。
返回后通知(After returning advice):在連接點正常完成后運行的通知(例如,如果方法返回而沒有拋出異常)。
拋出異常通知后(After throwing advice):如果方法通過拋出異常退出,則運行通知。
After (finally) 通知(After (finally) advice):不管連接點退出的方式(正常或異常返回)都將運行的通知。
環繞通知(Around advice):環繞連接點的通知,例如方法調用。這是最有力的建議。環繞通知可以在方法調用前后執行自定義行為。它還負責選擇是繼續連接點還是通過返回自己的返回值或拋出異常來縮短建議的方法執行。
// @Before說明這是一個前置通知,log函數中是要前置執行的代碼,JoinPoint是連接點, @Before("pointcut()") public void log(JoinPoint joinPoint) { }
織入是將切面和業務邏輯對象連接起來, 并創建通知代理的過程。織入可以在編譯時,類加載時和運行時完成。在編譯時進行織入就是靜態代理,而在運行時進行織入則是動態代理。
關鍵就是:切點定義了哪些連接點會得到通知
所謂靜態代理就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強。ApsectJ是靜態代理的實現之一,也是最為流行的。靜態代理由于在編譯時就生成了代理類,效率相比動態代理要高一些。AspectJ可以單獨使用,也可以和Spring結合使用。
與靜態代理不同,動態代理就是說AOP框架不會去修改編譯時生成的字節碼,而是在運行時在內存中生成一個AOP代理對象,這個AOP對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調原對象的方法。
Spring AOP中的動態代理主要有兩種方式:JDK動態代理和CGLIB動態代理。
JDK代理通過反射來處理被代理的類,并且要求被代理類必須實現一個接口。核心類是 InvocationHandler接口 和 Proxy類。
而當目標類沒有實現接口時,Spring AOP框架會使用CGLIB來動態代理目標類。?
CGLIB(Code Generation Library
),是一個代碼生成的類庫,可以在運行時動態的生成某個類的子類。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態代理的。核心類是 MethodInterceptor 接口和Enhancer 類
到此,關于“Spring AOP的基本概念是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。