Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第3章 Spring AOP_第1頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第3章 Spring AOP_第2頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第3章 Spring AOP_第3頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第3章 Spring AOP_第4頁
Java EE企業(yè)級應(yīng)用開發(fā)教程課件 第3章 Spring AOP_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章SpringAOP《JavaEE企業(yè)級應(yīng)用開發(fā)教程(Spring+SpringMVC+MyBatis)》學(xué)習(xí)目標(biāo)/Target了解AOP的概念,能夠簡述AOP的優(yōu)點熟悉JDK動態(tài)代理,并實現(xiàn)JDK動態(tài)代理的案例熟悉CGLIB動態(tài)代理,并實現(xiàn)CGLIB動態(tài)代理的案例掌握基于XML的AOP實現(xiàn)掌握基于注解的AOP實現(xiàn)章節(jié)概述/Summary在JavaEE應(yīng)用程序開發(fā)中,經(jīng)常需要處理橫跨多個模塊的功能需求,這些需求并非業(yè)務(wù)邏輯,而是涉及應(yīng)用程序運行環(huán)境和共性方面的問題,如日志記錄、安全控制、事務(wù)管理和性能監(jiān)控等。如果在每個模塊中都重復(fù)實現(xiàn)這些功能,會導(dǎo)致代碼冗余、可維護(hù)性降低等問題。為了解決這些問題,開發(fā)者可以利用Spring框架的AOP來管理和復(fù)用這些通用的橫切關(guān)注點,從而提高代碼的可重用性和可維護(hù)性。本章將對SpringAOP的相關(guān)知識進(jìn)行講解。目錄/Contents3.13.2AOP概述SpringAOP的實現(xiàn)機(jī)制3.3SpringAOP集成AspectJ的實現(xiàn)AOP概述3.13.1

AOP概述先定一個小目標(biāo)!

先定一個小目標(biāo)!了解AOP的概念,能夠簡述AOP的優(yōu)點AOP的全稱是AspectOrientedProgramming,即面向切面編程,它是一種編程方法論,是OOP(ObjectOrientedProgramming,面向?qū)ο缶幊蹋┑囊环N補(bǔ)充。AOP可以通過將業(yè)務(wù)邏輯與橫切關(guān)注點(如安全控制、日志記錄等在多個模塊或組件中共同存在的功能)分離,從而實現(xiàn)更好的代碼模塊化、可維護(hù)性和可復(fù)用性。在SpringAOP中,開發(fā)者可以通過定義切面(Aspect)來實現(xiàn)這種分離,并通過在運行時動態(tài)地將切面織入(Weave)到業(yè)務(wù)邏輯中,實現(xiàn)將橫切關(guān)注點應(yīng)用于多個組件、對象或方法中,避免了代碼的重復(fù)和低效性。3.1

AOP概述3.1

AOP概述類與切面的關(guān)系3.1

AOP概述AOP的常用術(shù)語如下。1.切面:切面(Aspect)是用于橫向劃分關(guān)注點的模塊化單元,通常用于封裝橫向插入系統(tǒng)的功能。2.連接點:連接點(Joinpoint)是程序執(zhí)行過程中的特定節(jié)點,一個連接點通常代表一個方法的執(zhí)行。3.切點:切點(Pointcut)是指程序執(zhí)行過程中滿足預(yù)先指定條件的連接點。4.通知:通知(Advice)是切面中的實際代碼,用于實現(xiàn)切面的具體功能。5.目標(biāo)對象:目標(biāo)對象(TargetObject)指的是被切面增強(qiáng)的原始對象。6.織入:織入(Weaving)是指將切面代碼插入到目標(biāo)對象上,從而生成代理對象的過程。7.代理對象:代理對象(ProxyObject)是織入切面后創(chuàng)建的對象,用于應(yīng)用通知到目標(biāo)對象。8.引介:引介(Introduction)是一種特殊的通知,用于為目標(biāo)對象添加新的屬性和方法。SpringAOP的實現(xiàn)機(jī)制3.23.2SpringAOP的實現(xiàn)機(jī)制Spring框架中實現(xiàn)AOP時,應(yīng)用程序在運行期會為目標(biāo)對象生成一個動態(tài)代理對象,并在代理對象中實現(xiàn)對目標(biāo)對象的增強(qiáng)。根據(jù)代理對象的創(chuàng)建方式,可以將AOP實現(xiàn)機(jī)制分為JDK動態(tài)代理和CGLIB動態(tài)代理,本節(jié)將針對這兩種實現(xiàn)機(jī)制進(jìn)行講解。3.2.1

JDK動態(tài)代理先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉JDK動態(tài)代理,并實現(xiàn)JDK動態(tài)代理的案例AOP中的JDK動態(tài)代理是一種基于接口的代理方式,即只能為接口創(chuàng)建代理實例。JDK動態(tài)代理是SpringAOP的默認(rèn)的動態(tài)代理機(jī)制,它利用Java反射機(jī)制在運行時動態(tài)地創(chuàng)建目標(biāo)對象的代理對象,并將通知與代理對象關(guān)聯(lián)起來,從而實現(xiàn)對目標(biāo)對象的增強(qiáng)。JDK動態(tài)代理使用Java中的java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口來創(chuàng)建代理對象。首先需要定義一個InvocationHandler實現(xiàn)類,它包含一個invoke()方法,該方法中定義了增強(qiáng)的邏輯。然后通過Proxy類的newProxyInstance()方法創(chuàng)建代理對象,該方法通過接收類加載器、代理實現(xiàn)的接口以及InvocationHandler對象來生成代理對象。3.2.1

JDK動態(tài)代理3.2.1

JDK動態(tài)代理(1)創(chuàng)建項目并依賴在IDEA中創(chuàng)建一個名為chapter03的Maven項目,然后在項目的pom.xml文件中引入Spring的核心依賴。下面通過一個案例演示Spring中JDK動態(tài)代理的實現(xiàn)過程。3.2.1

JDK動態(tài)代理(2)創(chuàng)建接口和實現(xiàn)類文件3-1

UserDao.java文件3-2

UserDaoImpl.java源代碼在chapter03項目下創(chuàng)建com.itheima.dao包,在該包下創(chuàng)建接口UserDao,在該接口中編寫添加和刪除的方法。在com.itheima.dao包下創(chuàng)建UserDao接口的實現(xiàn)類UserDaoImpl,在重寫接口的方法中添加一條輸出語句,具體如文件3-1和文件3-2所示。3.2.1

JDK動態(tài)代理(3)創(chuàng)建切面類文件3-3MyAspect.java源代碼在chapter03項目下創(chuàng)建一個com.itheima.aspect包,并在該包下創(chuàng)建切面類MyAspect,在該類中定義一個模擬權(quán)限檢查的方法和一個模擬記錄日志的方法作為切面中的通知,如文件3-3所示。3.2.1

JDK動態(tài)代理(4)創(chuàng)建代理類文件3-4JdkProxy.java源代碼在chapter03項目下創(chuàng)建xy包,在該包下創(chuàng)建實現(xiàn)InvocationHandler接口的代理類JdkProxy,并在代理類中編寫代理方法,在代理方法中通過Proxy類實現(xiàn)動態(tài)代理,如文件3-4所示。3.2.1

JDK動態(tài)代理(5)創(chuàng)建測試類文件3-5JdkTest.java源代碼在項目的com.itheima包中創(chuàng)建測試類JdkTest。在該類中的main()方法中創(chuàng)建代理類對象和目標(biāo)對象,然后獲得對目標(biāo)對象userDao增強(qiáng)后的代理對象,最后調(diào)用該對象中的添加用戶和刪除用戶方法,如文件3-5所示。3.2.1

JDK動態(tài)代理(6)測試效果運行文件3-5,運行結(jié)果如下圖所示。3.2.2CGLIB動態(tài)代理先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉CGLIB動態(tài)代理,并實現(xiàn)CGLIB動態(tài)代理的案例JDK動態(tài)代理的使用非常簡單,但它還有一定的局限性——使用動態(tài)代理的對象必須實現(xiàn)一個或多個接口。如果要對沒有實現(xiàn)接口的類進(jìn)行代理,那么可以使用CGLIB動態(tài)代理。

CGLIB(CodeGenerationLibrary,代碼生成庫)是一個高性能開源的代碼生成包,它可以在運行時擴(kuò)展Java類和實現(xiàn)接口。CGLIB動態(tài)代理的原理是通過繼承來創(chuàng)建一個目標(biāo)對象的子類,并重寫其方法,從而實現(xiàn)攔截器對目標(biāo)方法的增強(qiáng)。CGLIB代理類的創(chuàng)建速度相對JDK動態(tài)代理要慢一些,但是在運行時的執(zhí)行效率比JDK動態(tài)代理快,且不需要目標(biāo)對象實現(xiàn)接口。3.2.2CGLIB動態(tài)代理CGLIB提供了一個攔截器接口MethodInterceptor,MethodInterceptor中定義了一個intercept()方法用于攔截目標(biāo)對象方法的調(diào)用。使用CGLIB動態(tài)代理時,代理類需要實現(xiàn)MethodInterceptor接口,并在重寫的intercept()方法中編寫自定義的邏輯來實現(xiàn)對目標(biāo)方法的增強(qiáng)或攔截處理。3.2.2CGLIB動態(tài)代理3.2.2CGLIB動態(tài)代理下面通過一個案例來演示CGLIB動態(tài)代理的實現(xiàn)過程,具體如下。(1)創(chuàng)建目標(biāo)類文件3-6OrderDao.java源代碼在項目的com.itheima.dao包中創(chuàng)建一個目標(biāo)類OrderDao,在該類中定義一個添加訂單的方法和一個刪除訂單的方法,如文件3-6所示。3.2.2CGLIB動態(tài)代理(2)創(chuàng)建代理類文件3-7CglibProxy.java源代碼在xy包中,創(chuàng)建代理類CglibProxy,該代理類實現(xiàn)MethodInterceptor接口,并在重寫接口的intercept()方法中編寫增強(qiáng)的邏輯代碼,如文件3-7所示。3.2.2CGLIB動態(tài)代理(3)創(chuàng)建測試類文件3-8CglibTest.java源代碼在com.itheima包中創(chuàng)建測試類CglibTest。在該類的main()方法中首先創(chuàng)建代理類對象和目標(biāo)對象,然后獲得增強(qiáng)目標(biāo)對象后的代理對象,最后調(diào)用代理對象的添加訂單和刪除訂單方法,如文件3-8所示。3.2.2CGLIB動態(tài)代理(4)測試效果運行文件3-8,運行結(jié)果如下圖所示。SpringAOP集成AspectJ的實現(xiàn)3.33.3SpringAOP集成AspectJ的實現(xiàn)SpringAOP是Spring框架提供的一種簡化版的AOP組件,提供了基本的AOP功能,但在某些復(fù)雜的情況下可能會有一些限制。為了彌補(bǔ)這些限制,開發(fā)者通常會將SpringAOP與其他AOP實現(xiàn)(如AspectJ)結(jié)合使用,以滿足更高級別的AOP功能需求。在這種情況下,最常見的組合就是SpringAOP集成AspectJ使用。SpringAOP集成AspectJ實現(xiàn)AOP時可以基于XML和注解兩種方式,下面這兩種AOP的實現(xiàn)進(jìn)行講解。3.3.1

基于XML的AOP實現(xiàn)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握基于XML的AOP實現(xiàn)SpringAOP集成AspectJ時,基于XML的AOP實現(xiàn)需要在XML文件中定義切面、切點及通知等信息,Spring提供了一系列標(biāo)簽用于實現(xiàn)XML文件中切面、切點及通知等信息的配置。3.3.1

基于XML的AOP實現(xiàn)標(biāo)簽描述<aop:config>SpringAOP配置的根標(biāo)簽,用于包含其他AOP相關(guān)的配置<aop:aspect>用于配置切面,可以定義切面類和切面相關(guān)的通知類型<aop:advisor>用于配置通知器,可以將切面和切點組合起來,并將其應(yīng)用到目標(biāo)對象上<aop:pointcut>用于配置切點,可以指定切面在哪些連接點處起作用,即定義切點表達(dá)式3.3.1

基于XML的AOP實現(xiàn)標(biāo)簽描述<aop:before>用于配置前置通知,在目標(biāo)方法執(zhí)行前實施增強(qiáng),通常應(yīng)用于權(quán)限管理功能<aop:after>用于配置后置通知,在目標(biāo)方法執(zhí)行后實施增強(qiáng),通常應(yīng)用于關(guān)閉流、上傳文件、刪除臨時文件等功能<aop:around>用于配置環(huán)繞方式,在目標(biāo)方法執(zhí)行前后實施增強(qiáng),通常應(yīng)用于日志、事務(wù)管理等功能<aop:after-returning>用于配置返回通知,在目標(biāo)方法成功執(zhí)行之后調(diào)用通知,通常應(yīng)用于處理返回值、日志記錄等功能<aop:after-throwing>用于配置拋出異常通知,在方法拋出異常后實施增強(qiáng),通常應(yīng)用于處理異常記錄日志等功能3.3.1

基于XML的AOP實現(xiàn)1.配置切面在Spring的配置文件中,如果要定義一個切面,可以使用<aop:aspect>標(biāo)簽,這個標(biāo)簽會將一個已定義好的SpringBean轉(zhuǎn)換成切面Bean,并將其織入到目標(biāo)對象的方法上面去。因此,在使用<aop:aspect>標(biāo)簽之前,需要在配置文件中先定義一個普通的SpringBean。<aop:aspect>

標(biāo)簽提供了id屬性和ref屬性,分別用于為該切面指定一個在Spring應(yīng)用上下文中的唯一ID,以及用于引用一個現(xiàn)有的切面Bean。3.3.1

基于XML的AOP實現(xiàn)2.配置切點在Spring的配置文件中,切點是通過<aop:pointcut>標(biāo)簽來定義的。當(dāng)

<aop:pointcut>

標(biāo)簽作為

<aop:config>

標(biāo)簽的子標(biāo)簽定義時,定義的切點可以被多個切面共享,從而成為全局切點;而當(dāng)

<aop:pointcut>

標(biāo)簽作為

<aop:aspect>

標(biāo)簽的子標(biāo)簽時,該切點僅對當(dāng)前切面有效,而不會成為全局切點。3.3.1

基于XML的AOP實現(xiàn)在定義<aop:pointcut>標(biāo)簽時,通常會指定id和expression兩個屬性,其中,id屬性用于為切點指定一個在配置文件中的唯一標(biāo)識符,expression屬性用于定義切點的表達(dá)式,切點表達(dá)式的基本格式如下。execution(modifiers-pattern?return-type-patterndeclaring-type-pattern?name-pattern(param-pattern)throws-pattern?)①modifiers-pattern:用于指定方法訪問修飾符的模式。②return-type-pattern:用于指定方法返回值類型的模式。③declaring-type-pattern:用于指定聲明方法的類的模式。④name-pattern:用于指定方法名稱模式。⑤parameter-pattern:用于指定方法參數(shù)列表的模式。⑥throws-pattern:用于指定方法拋出的異常類型的模式。3.3.1

基于XML的AOP實現(xiàn)execution(*com.example.myapp.MyClass.myMethod(..))execution(public**(..))execution(*set*(..))execution(*com.example..*.*(..))匹配com.example.myapp.MyClass類中所有myMethod()方法的執(zhí)行。匹配所有公共方法的執(zhí)行,無論返回類型、類名和方法名是什么。匹配所有set開頭的方法的執(zhí)行。匹配com.example包和子包中所有類的所有方法的執(zhí)行。3.3.1

基于XML的AOP實現(xiàn)3.配置通知SpringAOP中的通知采用"切面+連接點"的方式來定義的。連接點是程序執(zhí)行過程中的特定點,切面定義了通知要織入到哪些連接點上。SpringAOP提供了五種通知類型,這些通知按照織入的時間點分類分別為前置通知(Before)、后置通知(After)、返回通知(After-returning)、拋出異常通知(After-throwing)和環(huán)繞通知(Around)。3.3.1

基于XML的AOP實現(xiàn)屬性描述pointcut用于在切面內(nèi)部定義切點表達(dá)式,Spring將在匹配該表達(dá)式的連接點時織入該通知pointcut-ref用于指定一個已經(jīng)存在的切點名稱,通常pointcut和pointcut-ref兩個屬性只需要使用其中一個即可method用于指定具體的通知方法throwing該屬性只對<after-throwing>標(biāo)簽有效,它用于指定一個形參名,異常通知方法可以通過該形參訪問目標(biāo)方法所拋出的異常returning該屬性只對<after-returning>標(biāo)簽有效,它用于指定一個形參名,返回通知方法可以通過該形參訪問目標(biāo)方法的返回值通知標(biāo)簽的常用屬性3.3.1

基于XML的AOP實現(xiàn)下面通過一個案例演示如何在Spring中基于XML實現(xiàn)AOP。(1)引入依賴pom.xml源代碼在chapter03項目的pom.xml文件中AspectJ框架的相關(guān)依賴,在pom.xml中添加的代碼如下所示。3.3.1

基于XML的AOP實現(xiàn)(2)創(chuàng)建切面類文件3-9XmlAdvice.java源代碼在項目中創(chuàng)建com.itheima.advice包,并在該包下創(chuàng)建切面類XmlAdvice,并在該類中定義不同的方法作為切面中的通知,具體代碼如文件3-9所示。3.3.1

基于XML的AOP實現(xiàn)(3)創(chuàng)建配置文件并配置AOP信息文件3-10aplicationContext.xml源代碼在chapter03項目的resource文件夾下創(chuàng)建applicationContext.xml文件,并在該配置文件中定義兩個Bean:userDao和xmlAdvice,同時將userDao作為切點,xmlAdvice作為切面進(jìn)行設(shè)置,具體代碼如文件3-10所示。3.3.1

基于XML的AOP實現(xiàn)(4)創(chuàng)建測試類文件3-11XmlAOPTest.java源代碼在com.itheima包中創(chuàng)建測試類XmlAOPTest,在測試類中獲取名稱為userDao的Bean,并執(zhí)行其添加用戶和刪除用戶的方法,具體代碼如文件3-11所示。3.3.1

基于XML的AOP實現(xiàn)(5)測試效果在IDEA中運行文件3-11,運行結(jié)果如下圖所示。3.3.1

基于XML的AOP實現(xiàn)(5)測試效果如果要查看異常通知的執(zhí)行效果,可以在UserDaoImpl類的addUser()方法中添加錯誤代碼,如“inti=10/0;”,重新運行測試類,將可以看到異常通知的執(zhí)行,此時控制臺的輸出結(jié)果如下圖所示。3.3.2

基于注解的AOP實現(xiàn)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握基于注解的AOP實現(xiàn)AspectJ提供了基于注解的方式實現(xiàn)AOP,這樣可以避免大量的XML配置,使得代碼更加簡潔、可讀性更高,并且方便維護(hù)。3.3.2

基于注解的AOP實現(xiàn)注解名稱描述@AspectJ用于將一個類標(biāo)記為切面@Pointcut用于定義切點表達(dá)式,可以通過一個方法簽名來表示切點名稱@Before用于定義前置通知,在使用時,使用value屬性指定一個切點,可以是已有的切點,也可以直接定義切點表達(dá)式3.3.2

基于注解的AOP實現(xiàn)注解名稱描述@AfterReturning用于定義后置通知,在使用時可以指定pointcut/value和returning屬性,其中pointcut/value這兩個屬性的作用一樣,都用于指定切點。returning屬性值用于表示Advice方法中可定義與此同名的形參,該形參可用于訪問目標(biāo)方法的返回值@Around用于定義環(huán)繞通知,在使用時通過value屬性指定一個切點@AfterThrowing用于定義異常通知,在使用時可指定pointcut/valu

溫馨提示

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

最新文檔

評論

0/150

提交評論