版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第14章
面向切面編程SpringAOP簡介
面向切面編程(AOP)提供另外一種角度來思考程序結(jié)構(gòu),通過這種方式彌補了面向?qū)ο缶幊蹋∣OP)的不足。除了類(classes)以外,AOP提供了切面。切面對關(guān)注點進行模塊化,例如橫切多個類型和對象的事務(wù)管理。在AOP中,把分散程序各個部分,解決同樣問題的代碼片段,稱為問題的切面(或方面)。一個切面可以簡單的理解為解決跨越多個模塊的交叉關(guān)注點問題的模塊。通過AOP可以使用一種非常簡單、靈活的方式,在切面中實現(xiàn)了以前需要在各個核心關(guān)注點中穿插的交叉關(guān)注的功能,從而使得解決系統(tǒng)中交叉關(guān)注點問題的模塊更加容易設(shè)計、實現(xiàn)及維護。AOP相關(guān)框架及工具AspectJ:對java進行了擴展,形成一個功能強大、靈活、實用的AOP語言。AspectWerkz:一個動態(tài)、輕量級、性能表現(xiàn)良好的AOP框架。JBoss-AOP:JBoss公司開發(fā)的基于方法攔截及源碼級數(shù)據(jù)的AOP實現(xiàn)框架。
Spring-AOP:使用基于代理及攔截器的機制,與SpringIOC容器融入一體的AOP框架。
AOP中的五種AdviceAOP中的相關(guān)術(shù)語
1)關(guān)注點(Concern)
關(guān)注點也就是我們要考察或解決的問題。把一個系統(tǒng)中的核心功能稱為核心關(guān)注點跨越多個模塊的關(guān)注點稱為橫切關(guān)注點或交叉關(guān)注點(CrosscuttingConcerns)。在AOP的編程方法中,主要在于對關(guān)注點的提起及抽象。2)切面(Aspect)
切面是一個抽象的概念,從軟件的角度來說是指在應(yīng)用程序不同模塊中的某一個領(lǐng)域或方面。
AOP中的切面(aspect)是實現(xiàn)世界領(lǐng)域問題的抽象,除了包括屬性、方法以外,同時切面中還包括切入點Pointcut、增強(advice)等。3)連接點(Joinpoint)
連接點也就是運用程序執(zhí)行過程中需要插入切面模塊的某一點。這個點可以是一個方法、一個屬性、構(gòu)造函數(shù)、類靜態(tài)初始化塊,甚至一條語句。4)切入點(Pointcut)
切入點指一個或多個連接點,可以理解成一個點的集合。切入點的描述比較具體,而且一般會跟連接點上下文環(huán)境結(jié)合。5)增強或通知(Advice)
增強(Advice)里面定義了切面中的實際邏輯(即實現(xiàn)),即法增強(Advice)是指在定義好的切入點處,所要執(zhí)行的程序代碼。Spring的AOP簡介
AOP是Spring框架的重要組成部分。
SpringAOP使用純Java實現(xiàn),不需要專門的編譯過程。
Spring沒有像AspectJ那樣強大的功能,只支持與方法調(diào)用有關(guān)的連接點。
Spring中的AOP代理由Spring的Ioc容器負責(zé)生成、管理,其依賴關(guān)系也由Ioc容器負責(zé)管理。
AOP編程只需要程序員參加3個部分:定義普通業(yè)務(wù)組件定義切入點定義增強處理Spring有兩種方式定義切入點和增強處理:基于Annotation的方式:使用@Aspect、@PointCut等Annotation基于XML配置文件的管理方式:使用Spring的配置文件啟用@AspectJ支持為了在Spring配置中使用@AspectJaspects,必須首先啟用Spring對基于@AspectJaspects的配置支持,自動代理(autoproxying)基于通知是否來自這些切面。自動代理是指Spring會判斷一個bean是否使用了一個或多個切面通知,并據(jù)此自動生成相應(yīng)的代理以攔截其方法調(diào)用,并且確認通知是否如期進行。
配置文件示例:
<?xmlversion="1.0"encoding="GBK"?><beansxmlns="http:///schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="http:///schema/context"xmlns:aop="http:///schema/aop"xsi:schemaLocation="http:///schema/beans/schema/beans/spring-beans-2.5.xsdhttp:///schema/context/schema/context/spring-context-2.5.xsdhttp:///schema/aop/schema/aop/spring-aop-2.5.xsd"><context:component-scanbase-package="lee"><context:include-filtertype="annotation"expression="org.aspectj.lang.annotation.Aspect"/></context:component-scan><aop:aspectj-autoproxy/></beans>Spring2支持的AspectJ標簽@Aspect-標識一個切面;@Pointcut-標識一個切入點;@Before-標識一個前置增強;@AfterReturning-標識返回后增強;@AfterThrowing-標識異常拋出增強;@After-標識后增強;@Around-標識環(huán)繞增強;1)定義切面Bean
當啟動了@AspectJ支持后,只要在Spring容器中配置一個@Aspect注釋的Bean,Spring將會自動識別該Bean,并將該Bean作為切面處理。例如:@AspectpublicclassAspectTest{}
注意:當使用@Aspect標注一個Java類后,Spring將不會把該Bean當成Bean組件處理。2)定義Before增強處理使用@Before標注。通常需要通過一個value屬性,指定一個切入點表達式,用于指定該增強處理將被織入哪些切入點。@AspectpublicclassBeforeAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@Before("execution(*lee.*.*(..))")publicvoidauthority(){System.out.println("模擬執(zhí)行權(quán)限檢查");}}
@ComponentpublicclassChineseimplementsPerson{publicStringsayHello(Stringname){returnname+"Hello,SpringAOP";}publicvoideat(Stringfood){System.out.println("我正在吃:"+food);}}該類可被無限地增強。3)After增強處理
使用@After標注。常用屬性:
value:指定該增強處理被織入的切入點。與AfterReturing的區(qū)別:
AfterReturing增強處理只有在目標方法成功完成后才會被織入,而After增強處理不管目標方法如何完成(包括成功完成和遇到異常),它都會被織入。
例如:@AspectpublicclassAfterAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@After("execution(*lee.*.*(..))")publicvoidrelease(){System.out.println("模擬方法結(jié)束后的釋放資源...");}}4)AfterReturning增強處理使用@AfterReturning標注,將在目標方法完成之后被織入。常用屬性:pointcut/value:用來指定該切入點對應(yīng)的切入點表達式。returning:指定一個返回值形參名,增強處理定義的方法可以通過該形參名來訪問目標方法的返回值。例如:@AspectpublicclassAfterReturningAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@AfterReturning(pointcut="execution(*lee.*.*(..))",returning="rvt")publicvoidlog(Object
rvt){System.out.println("獲取目標方法返回值:"+rvt);System.out.println("模擬記錄日志功能...");}}5)定義AfterThrowing增強處理使用@AfterThrowing標注,主要用于處理程序中未處理的異常。常用屬性:pointcut/value:指定該切入點對應(yīng)的切入表達式throwing:指定一個返回值形參名,增強處理定義的方法可以通過該形參名來訪問目標方法中所拋出的異常對象。例如:@AspectpublicclassAfterThrowingAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@AfterThrowing(pointcut="execution(*lee.*.*(..))",throwing="ex")publicvoiddoRecoveryActions(Throwableex){System.out.println("目標方法中拋出的異常:"+ex);System.out.println("模擬拋出異常后的增強處理...");}}
AOP的AfterThrowing處理與結(jié)構(gòu)化異常處理的區(qū)別:catch捕捉意味著完全處理該異常,如果catch塊中沒有重新拋出新異常,則該方法可以正常結(jié)束。AfterThrowing處理雖然處理了該異常,但它不能完全處理該異常,該異常依然會向上傳播。6)Around增強處理
使用@Around標注。
Around增強處理功能更加強大,近似于Before和AfterReturing增強處理的總和。與Before和AfterReturing增強處理不同的是:Around增強處理甚至可以決定目標方法在什么時候被執(zhí)行,如何執(zhí)行,甚至可以完全阻止目標方法的執(zhí)行。
Around增強處理可以改變執(zhí)行目標方法的參數(shù)值,也可以改變執(zhí)行目標方法之后的返回值。例如:@AspectpublicclassAroundAdviceTest{//執(zhí)行l(wèi)ee包下所有類的、所有方法都將作為切入點@Around("execution(*lee.*.*(..))")publicObjectprocessTx(ProceedingJoinPoint
jp)throwsjava.lang.Throwable{System.out.println("執(zhí)行目標方法之前,模擬開始事務(wù)...");//執(zhí)行目標方法,并保存目標方法執(zhí)行后的返回值Objectrvt=ceed(newString[]{"被改變的參數(shù)"});System.out.println("執(zhí)行目標方法之后,模擬結(jié)束事務(wù)...");returnrvt+"新增的內(nèi)容";}}
Around增強處理需要通過value屬性指定該增強處理被織入的切入點。當定義Around增強處理方法時,該方法的第一個參數(shù)必須時ProceedingJoinPoint類型,在增強處理方法體內(nèi),調(diào)用ProceedingJoinPoint的proceed()方法才會執(zhí)行目標方法。調(diào)用proceed()時,還可以傳入一個Object[]對象,該數(shù)組中的值將被傳入目標方法作為執(zhí)行方法的實參。7)定義切入點
AspectJ和Spring都允許定義切入點。所謂定義切入點,實質(zhì)就是為一個切入點表達式起一個名字,從而可以在多個增強處理中重用該名稱。切入點定義包括兩部分:一個切入點表達式一個包含名字和任意參數(shù)的方法簽名定義切入點使用@Pointcut標注@AspectpublicclassSystemArchitecture
{@Pointcut("execution(*lee.Chin*.say*(..))")publicvoidmyPointcut(){}}
若需要使用該切入點,則可在定義增強處理時使用pointcut參數(shù)。@AfterReturning(pointcut="SystemArchitecture.myPointcut()",returning="retVal")在下圖中展示了如何利用通配符,使多個切面同時使用一個定義。XML方式配置AOP1)定義切面使用<aop:aspect…/>元素。可在該元素中使用ref屬性為該切面Bean配置依賴注入。常用屬性:id:定義該切面的標識名ref:指定引用的SpringBean作為切面Beanorder:指定切面Bean的優(yōu)先級2)配置增強處理使用XML配置增強處理使用以下幾個元素:<aop:before…/><aop:after…/><aop:after-
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年揚州客運從業(yè)資格證試題答案
- 2024年呼和浩特客運員考試題庫答案
- 2024年承德客運資格證考試題目
- 2024年廣東客運資格證操作考試
- 吉首大學(xué)《工程制圖實驗》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《素描基礎(chǔ)II》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《電影造型語言》2021-2022學(xué)年期末試卷
- 平地整田承包協(xié)議書范文模板
- 2022年山東省公務(wù)員錄用考試《申論》真題(B類)及答案解析
- 2024年大屏安裝合同簡易協(xié)議書模板
- 繼承優(yōu)良傳統(tǒng)弘揚中國精神 (模板)
- 碳氈石墨氈全球市場研究報告 - 2024 年至 2030 年產(chǎn)業(yè)分析、規(guī)模、份額、成長、趨勢與預(yù)測
- 綠色建筑材料的研發(fā)與應(yīng)用
- 門安裝施工工藝
- 留學(xué)行業(yè)財務(wù)分析
- 醫(yī)院感染管理培訓(xùn)課件:內(nèi)鏡操作中的感染控制要點
- 職業(yè)生涯規(guī)劃羽毛球教練員
- 藍瓊死亡游戲安全教育課件
- 《五四運動》【優(yōu)質(zhì)課件】
- 列名單鋪墊和邀約課件
- 怎樣讓桃樹高產(chǎn)桃樹高產(chǎn)栽培技術(shù)
評論
0/150
提交評論