Java EE輕量級框架應用實戰-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第8章 Spring AOP_第1頁
Java EE輕量級框架應用實戰-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第8章 Spring AOP_第2頁
Java EE輕量級框架應用實戰-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第8章 Spring AOP_第3頁
Java EE輕量級框架應用實戰-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第8章 Spring AOP_第4頁
Java EE輕量級框架應用實戰-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第8章 Spring AOP_第5頁
已閱讀5頁,還剩43頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SpringAOP概述動態代理基于代理類的AOP實現基于XML的聲明式AspectJ基于注解的聲明式AspectJ第8章

SpringAOP2024/1/29學習目標/Target2了解AOP的概念和作用

理解AOP術語

熟悉Spring中兩種動態代理方式的區別

掌握基于代理類的AOP實現掌握基于XML的聲明式AspectJ和

基于注解的聲明式AspectJ章節概述/Summary3Spring的AOP模塊是Spring框架體系中十分重要的內容,該模塊一般適用于具有橫切邏輯的場景,如訪問控制、事務管理和性能監控等,本章將對SpringAOP的相關知識進行詳細講解。目錄/CONTENTSSpringAOP概述基于XML的聲明式AspectJ基于代理類的AOP實現動態代理4基于注解的聲明式AspectJ14325SpringAOP概述01第8章SpringAOP什么是AOP?SpringAOP簡介6

AOP的全稱是Aspect-OrientedProgramming,即面向切面編程(也稱面向方面編程)。它是面向對象編程(OOP)的一種補充,目前已成為一種比較成熟的編程方式。在傳統的業務處理代碼中,通常都會進行事務處理、日志記錄等操作。雖然使用OOP可以通過組合或者繼承的方式來達到代碼的重用,但如果要實現某個功能(如日志記錄),同樣的代碼仍然會分散到各個方法中。這樣,如果想要關閉某個功能,或者對其進行修改,就必須要修改所有的相關方法。這不但增加了開發人員的工作量,而且提高了代碼的出錯率。為了解決這一問題,AOP思想隨之產生。AOP采取橫向抽取機制,將分散在各個方法中的重復代碼提取出來,然后在程序編譯或運行時,再將這些提取出來的代碼應用到需要執行的地方。這種采用橫向抽取機制的方式,采用傳統的OOP思想顯然是無法辦到的,因為OOP只能實現父子關系的縱向的重用。雖然AOP是一種新的編程思想,但卻不是OOP的替代品,它只是OOP的延伸和補充。SpringAOP簡介7未使用AOP的面向切面編程案例

例如,訂單系統中有添加訂單信息、更新訂單信息和刪除訂單信息3個方法,這3個方法中都包含事務管理業務代碼,訂單系統的邏輯如圖所示。Spring

AOP概述8SpringAOP簡介9

AOP的使用,使開發人員在編寫業務邏輯時可以專心于核心業務,而不用過多的關注于其他業務邏輯的實現,這不但提高了開發效率,而且增強了代碼的可維護性。類與切面的關系AOP面向切面編程的優勢

由訂單系統可知,添加訂單信息、修改訂單信息、刪除訂單信息的方法體中都包含事務管理的業務邏輯,這就帶來了一定數量的重復代碼并使程序的維護成本增加。基于AOP的面向切面編程,可以為此類問題提供解決方案,AOP可以將事務管理的業務邏輯從這三個方法體中抽取到一個可重用的模塊,進而降低橫向業務邏輯之間的耦合,減少重復代碼。AOP的使用,使開發人員在編寫業務邏輯時可以專心于核心業務,而不用過多地關注其他業務邏輯的實現,不但提高了開發效率,又增強了代碼的可維護性。Spring

AOP概述10AOP術語11Aspect:封裝的用于橫向插入系統功能(如事務、日志等)的類Joinpoint:在程序執行過程中的某個階段點Pointcut:切面與程序流程的交叉點,即那些需要處理的連接點Advice(通知/增強處理):AOP框架在特定的切入點執行的增強處理,即在定義好的切入點處所要執行的程序代碼。可以將其理解為切面類中的方法。TargetObject(目標對象):指所有被通知的對象,也被稱為被增強對象。如果AOP框架采用的是動態的AOP實現,那么該對象就是一個被代理對象。Proxy(代理):將通知應用到目標對象之后,被動態創建的對象。Weaving(織入):將切面代碼插入到目標對象上,從而生成代理對象的過程。AOP術語

AOP并不是一個新的概念,AOP中涉及很多術語,如切面、連接點、切入點、通知/增強處理、目標對象、織入、代理和引介等,下面針對AOP的常用術語進行簡單介紹。

Spring

AOP術語切面(Aspect)切面是指關注點形成的類(關注點是指類中重復的代碼),通常是指封裝的、用于橫向插入系統的功能類(如事務管理、日志記錄等)。在實際開發中,該類被Spring容器識別為切面,需要在配置文件中通過<bean>元素指定。連接點(Joinpoint)連接點是程序執行過程中某個特定的節點,例如,某方法調用時或處理異常時。在SpringAOP中,一個連接點通常是一個方法的執行。

切入點(Pointcut)當某個連接點滿足預先指定的條件時,AOP就能夠定位到這個連接點,在連接點處插入切面,該連接點也就變成了切入點。通知/增強處理(Advice)通知/增強處理就是插入的切面程序代碼。可以將通知/增強處理理解為切面中的方法,它是切面的具體實現。12AOP術語

AOP并不是一個新的概念,AOP中涉及很多術語,如切面、連接點、切入點、通知/增強處理、目標對象、織入、代理和引介等,下面針對AOP的常用術語進行簡單介紹。

Spring

AOP術語目標對象(Target)目標對象是指被插入切面的方法,即包含主業務邏輯的類對象。或者說是被一個或者多個切面所通知的對象。織入(Weaving)將切面代碼插入到目標對象上,從而生成代理對象的過程。織入可以在編譯時,類加載時和運行時完成。在編譯時進行織入就是靜態代理,而在運行時進行織入則是動態代理。代理(Proxy)將通知應用到目標對象之后,程序動態創建的通知對象,就稱為代理。代理類既可能是和原類具有相同接口的類,也可能就是原類的子類,可以采用調用原類相同的方式調用代理類。引介(Introduction)引介是一種特殊的通知,它為目標對象添加一些屬性和方法。這樣,即使一個業務類原本沒有實現某一個接口,通過AOP的引介功能,也可以動態地為該業務類添加接口的實現邏輯,讓業務類成為這個接口的實現類。13動態代理02第8章SpringAOPJDK動態代理15

JDK動態代理是通過java.lang.reflect.Proxy

類來實現的,我們可以調用Proxy類的newProxyInstance()方法來創建代理對象。對于使用業務接口的類,Spring默認會使用JDK動態代理來實現AOP。CGLIB代理16

通過前面的學習可知,JDK的動態代理用起來非常簡單,但它是有局限性的,使用動態代理的對象必須實現一個或多個接口。

那么,如何代理沒有實現接口的類?CGLIB代理17

CGLIB(CodeGenerationLibrary)是一個高性能開源的代碼生成包,它采用非常底層的字節碼技術,對指定的目標類生成一個子類,并對子類進行增強。

如果想代理沒有實現接口的類,那么可以使用CGLIB代理。

JDK動態代理存在缺陷,它只能為接口創建代理對象,當需要為類創建代理對象時,就需要使用CGLib(CodeGenerationLibrary)動態代理,CGLib動態代理不要求目標類實現接口,它采用底層的字節碼技術,通過繼承的方式動態創建代理對象。Spring的核心包已經集成了CGLib所需要的包,所以開發中不需要另外導入JAR包。JDK與CGLib動態代理的比較18實現JDK動態代理與CGLIB動態代理的使用19需求說明使用JDK動態代理與CGLIB動態代理,對業務方法的執行過程進行模擬權限檢查、日志記錄。共性問題集中講解20常見問題及解決辦法代碼規范問題調試技巧共性問題集中講解基于代理類的AOP實現03第8章SpringAOPSpring的通知/增強類型22org.springframework.aop.MethodBeforeAdvice(前置通知/增強)

在目標方法執行前實施增強,可以應用于權限管理等功能。org.springframework.aop.AfterReturningAdvice(后置通知/增強)

在目標方法執行后實施增強,可以應用于關閉流、上傳文件、刪除

臨時文件等功能。ercept.MethodInterceptor(環繞通知/增強)

在目標方法執行前后實施增強,可以應用于日志、事務管理等功能。org.springframework.aop.ThrowsAdvice(異常拋出通知/增強)

在方法拋出異常后實施增強,可以應用于處理異常記錄日志等功能。org.springframework.aop.IntroductionInterceptor(引介通知/增強)

在目標類中添加一些新的方法和屬性,可以應用于修改老版本程序。

Spring按照通知在目標類方法的連接點位置,可以分為5種類型,具體如下:ProxyFactoryBean23

ProxyFactoryBean是FactoryBean接口的實現類,FactoryBean負責實例化一個Bean,而ProxyFactoryBean負責為其他Bean創建代理實例。在Spring中,使用ProxyFactoryBean是創建AOP代理的基本方式。ProxyFactoryBean類中的常用可配置屬性如下:使用基于代理類的AOP實現模擬權限檢查、

日志記錄功能24需求說明使用基于代理類的AOP對業務方法的執行過程進行模擬權限檢查、日志記錄。共性問題集中講解25常見問題及解決辦法代碼規范問題調試技巧共性問題集中講解基于XML的

聲明式AspectJ04第8章SpringAOPAspectJ開發27

AspectJ是一個基于Java語言的AOP框架,它提供了強大的AOP功能。Spring2.0以后,SpringAOP引入了對AspectJ的支持,并允許直接使用AspectJ進行編程,而Spring自身的AOPAPI也盡量與AspectJ保持一致。新版本的Spring框架,也建議使用AspectJ來開發AOP。使用AspectJ實現AOP有兩種方式:一種是基于XML的聲明式AspectJ,另一種是基于注解的聲明式AspectJ。概述使用AOP代理對象的好處

因為SpringAOP中的代理對象由IoC容器自動生成,所以開發者無須過多關注代理對象生成的過程,只需選擇連接點、創建切面、定義切點并在XML文件中添加配置信息即可。Spring提供了一系列配置SpringAOP的XML元素。

基于XMl的AOP實現28配置SpringAOP的XML元素29元素描述<aop:config>SpringAOP配置的根元素<aop:aspect>配置切面<aop:advisor>配置通知器<aop:pointcut>配置切點<aop:before>配置前置通知,在目標方法執行前實施增強,可以應用于權限管理等功能<aop:after>配置后置通知,在目標方法執行后實施增強,可以應用于關閉流、上傳文件、刪除臨時文件等功能<aop:around>配置環繞方式,在目標方法執行前后實施增強,可以應用于日志、事務管理等功能<aop:after-returning>配置返回通知,在目標方法成功執行之后調用通知<aop:after-throwing>配置異常通知,在方法拋出異常后實施增強,可以應用于處理異常記錄日志等功能基于XML的聲明式AspectJ是指通過XML文件來定義切面、切入點及通知,所有的切面、切入點和通知都必須定義在<aop:config>元素內。基于XML的聲明式AspectJ30<aop:config>元素及其子元素如下:小提示:圖中灰色部分標注的元素即為常用的配置元素

XML文件中常用元素的配置方式如下:基于XML的聲明式AspectJ31<beanid="myAspect"class="com.test.aspectj.xml.MyAspect"/><aop:config><aop:aspectid="aspect"ref="myAspect"><aop:pointcutexpression="execution(*com.test.jdk.*.*(..))“id="myPointCut"/><aop:beforemethod="myBefore"pointcut-ref="myPointCut"/><aop:after-returningmethod="myAfterReturning“pointcut-ref="myPointCut" returning="returnVal"/><aop:aroundmethod="myAround"pointcut-ref="myPointCut"/><aop:after-throwingmethod="myAfterThrowing“pointcut-ref="myPointCut" throwing="e"/><aop:aftermethod="myAfter"pointcut-ref="myPointCut"/></aop:aspect></aop:config>定義切面Bean配置切面配置切入點配置通知配置切面

在Spring的配置文件中,配置切面使用的是<aop:aspect>元素,該元素會將一個已定義好的SpringBean轉換成切面Bean,因此,在使用<aop:aspect>元素之前,要在配置文件中先定義一個普通的SpringBean。SpringBean定義完成后,通過<aop:aspect>元素的ref屬性即可引用該Bean。配置<aop:aspect>元素時,通常會指定id和ref兩個屬性。

基于XML的聲明式AspectJ32<aop:aspect>元素的id屬性和ref屬性的描述基于XML的聲明式AspectJ33屬性名稱描述id用于定義該切面的唯一標識ref用于引用普通的SpringBean配置切入點

在Spring的配置文件中,切入點是通過<aop:pointcut>元素來定義的。當<aop:pointcut>元素作為<aop:config>元素的子元素定義時,表示該切入點是全局的,它可被多個切面共享;當<aop:pointcut>元素作為<aop:aspect>元素的子元素時,表示該切入點只對當前切面有效。定義<aop:pointcut>元素時,通常會指定id、expression屬性。

基于XML的聲明式AspectJ34<aop:pointcut>元素的id屬性和expression屬性描述基于XML的聲明式AspectJ35屬性名稱描述id用于指定切入點的唯一標識expression用于指定切入點關聯的切入點表達式基于XML的聲明式AspectJ36切入點表達式

execution(*com.test.jdk.*.*(..))是定義的切入點表達式,該切入點表達式的意思是匹配com.test.jdk包中任意類的任意方法的執行。execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)表達式的主體返回類型,使用*代表所有類型需要攔截的包名類名,使用*代表所有類方法名,使用*代表所有方法方法的參數,其中的“..”表示任意參數注意:這里有一個空格切入點表達式的基本格式:定義的目標方法的訪問修飾符,如public、private等定義的目標方法的返回值類型,如void、String等定義的目標方法的類路徑,如com.test.jdk.UserDaoImpl具體需要被代理的目標方法,如add()方法需要被代理的目標方法包含的參數需要被代理的目標方法拋出的異常類型小提示:帶有問號(?)的部分表示可配置項,而其他部分屬于必須配置項。execution表達式各部分參數說明modifiers-pattern:表示定義的目標方法的訪問修飾符,如public、private等。ret-type-pattern:表示定義的目標方法的返回值類型,如void、String等。declaring-type-pattern:表示定義的目標方法的類路徑,如com.test.jdk.UserDaoImpl。name-pattern:表示具體需要被代理的目標方法,如add()方法。param-pattern:表示需要被代理的目標方法包含的參數,本章示例中目標方法參數都為空。throws-pattern:表示需要被代理的目標方法拋出的異常類型。

基于XML的聲明式AspectJ37execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)配置通知

在Spring的配置文件中,使用<aop:aspect>元素配置了5種常用通知,分別為前置通知、后置通知、環繞通知、返回通知和異常通知。

基于XML的聲明式AspectJ38<aop:aspect>元素的常用屬性基于XML的聲明式AspectJ39屬性描述pointcut該屬性用于指定一個切入點表達式,Spring將在匹配該表達式的連接點時織入該通知。pointcut-ref該屬性指定一個已經存在的切入點名稱,如配置代碼中的myPointCut。通常pointcut和pointcut-ref兩個屬性只需要使用其中一個即可。method該屬性指定一個方法名,指定將切面Bean中的該方法轉換為增強處理。throwing該屬性只對<after-throwing>元素有效,它用于指定一個形參名,異常通知方法可以通過該形參訪問目標方法所拋出的異常。returning該屬性只對<after-returning>元素有效,它用于指定一個形參名,后置通知方法可以通過該形參訪問目標方法的返回值。使用SpringAOP實現日志記錄功能40需求說明使用前置增強處理和后置增強處理對業務方法的執行過程進行日志記錄。提示(1)在項目中添加與Spring

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論