Spring AOP 前切入點及多參數(shù)問題_第1頁
Spring AOP 前切入點及多參數(shù)問題_第2頁
Spring AOP 前切入點及多參數(shù)問題_第3頁
Spring AOP 前切入點及多參數(shù)問題_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

SpringAOP前切入點及多參問題博客分類:?【AOP】【Spring】問題:看了很多關(guān)于SpringAOP的文章,在講各種切入方式(before、around、after-returnningthrown等)時,被切入的業(yè)務(wù)主體Bean的方法,基本都是無參數(shù)的。也有提到有參數(shù)的,但都是一個String型的參數(shù)。以before為例,無參數(shù)方法的切點配置為Xml代碼2?了<aop:beforemethod="before"pointcut="execution(*cn.xxxx..*.*(..))"/>如果方法有一個String型的參數(shù)param,則配置為Xml代碼誦<aop:beforemethod="before"arg-names="param"pointcut="execution(*cn.xxxx..*.*|(..))andargs(param)”/>注:如果參數(shù)其實可為任何類型,即Object。如果非要強調(diào)是String型,參數(shù)為其他類型的方法,不想被切點切入,則可寫成method="before(java.lang.String)"(經(jīng)實際測試arg-names="param”不寫也可以)但如果cn.xxxx..*fi#方法有多個參數(shù),且個數(shù)不定,要想讓切點可以切入,這么個寫法就不行了。我搜了N多的帖子,也沒能找到方法,最終幾經(jīng)輾轉(zhuǎn),終于在網(wǎng)友的幫助下,點破了這一層窗戶紙,其實也很簡單,還是在配置的寫法:Xml代碼在1<aop:beforemethod="before"pointcut="execution(*cn.xxxx..*.*(..))andargs(..)"/>與之配合的切點的寫法是Java代碼南1.publicvoidbefore(JoinPointjp)throwsThrowable{2....3.}這樣,不論業(yè)務(wù)Bean的方法有多少個參數(shù),都可以被這個切點切入了。如果需要訪問各個參數(shù),只需Java代碼南1.Object[]args=jp.getArgs();華麗的分割線其實,能夠滿足如上需求的方法,至少還有一種,就是攔截器。Mxl代碼源<beanid="myService"class="org.springframework.aop.framework.ProxyFactoryBean"><propertyname="interceptorNames"><list><value>beforeInterceptor</value></list>〈/property〉<propertyname="target"><refbean="realServiceTarget"/></property></bean>11.<beanid="realServiceTarget"class="cn.xxxx.xxx.Xxxx"/>

<beanid="beforeInterceptor"class="cn.xxxx.xxx.MyChecker"/>思路是在注入ServiceBean時,偷梁換柱一下,用myService代替,實際是指向Spring的攔截器,它可以在執(zhí)行真正的ServiceBean之前,先執(zhí)彳亍beforeintercept(所指向的攔截代碼(這里是MyChecker,這個攔截器要實現(xiàn)ercept.MethodinterceJtOJ,并完成publicObjectinvoke(Methodinvocationinvocation)throwsThro方法1)然后再交還給target?性指明的真正的ServiceBean。它不僅僅能夠得到方法的參數(shù),而且還有更強的功能決定是否繼續(xù)執(zhí)行targetJava代碼新1.publicclassMyCheckerimplementsMethodInterceptor{..5.16.}*用戶訪問認(rèn)證方法。*如果登錄合法則開始執(zhí)行服務(wù),否則返回錯誤。*/publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{MethodinvokeMethod=invocation.getMethod();Object[]args=invocation.getArguments();...if(....){ceed();//檢查OK,繼續(xù)執(zhí)行}else{returnnull;//檢查NG,阻斷執(zhí)彳亍}}看到了吧,這里不僅僅可以得到目標(biāo)方法的參數(shù)Object口args=invocation.getArguments();還可以,控制是否要繼續(xù)執(zhí)行目標(biāo)方法,還是阻斷。因此用來做認(rèn)證是再合適不過了。華麗的分割線為什么要加入兩條分割線之間的之一段呢?除了也作為before切入的另一種實現(xiàn)方式,更主要的是想引出下面的問題:我發(fā)現(xiàn),在我成功的用AOP切入之后,每次都執(zhí)行了兩遍切點,且我檢查了配置文件,并沒有重復(fù)定義<AOP>當(dāng)我在切點代碼中加入Java代碼二「|_1.Objecttarget=jp.getTarget();我發(fā)現(xiàn),這個target有一次是我的ServiceBean,而另一次是類似$Proxy22之類的東西。這才恍然大悟,它應(yīng)該是那個攔截器!也就是說,攔截器被切點切入了一次,真正的target又切入了一次。顯然,從配置文件的寫法上似乎是無法避免攔截器被切入的(雖然org.springframework.aop.framework.并不是切面),那只能在切點里想辦法回避了Java代碼南publicvoidbefore(JoinPointjp)throwsThrowable{Objecttarget=jp.getTarget();if(AopUtils.isAopProxy(target)){return;TOC\o"1-5"\h\z}...}至此,可以讓多參數(shù)方法被切入的before切點完成了。(after-returnni沒有遇到什么障礙,多參數(shù)也很簡單,甚至不用在pointcu配置中聲明,還可取到返回值)Xml代碼湘1.<aop:after-returningmethod="afterReturning"arg-names="retVal"returning="retVa|l"pointcut="execution(*cn.xxxx..*.*(..))”/>切點,可以同時得到JoinPoint和返回值Java代碼二「publicvoidafterReturning(JoinPointjp,ObjectretVal)throwsThrowable{Objecttarget=jp.getTarget()

溫馨提示

  • 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

提交評論