我的漫漫程序之旅

          專(zhuān)注于JavaWeb開(kāi)發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          Spring AOP學(xué)習(xí)體會(huì)


          需明確的幾個(gè)概念:
                                                            
          1、通知(Advice):用于告知系統(tǒng)將有哪些新的行為。
          2、切入點(diǎn)
          (Pointcut):
          定義了通知應(yīng)該在應(yīng)用到那些連接點(diǎn)
          3、目標(biāo)對(duì)象
          (Target)
          :被通知的對(duì)象。
          4、
          代理(Proxy):將通知應(yīng)用到目標(biāo)對(duì)象后創(chuàng)建的對(duì)象。

          Spring有兩種代理創(chuàng)建方式:

               1.如果目標(biāo)對(duì)象實(shí)現(xiàn)了一個(gè)或多個(gè)接口暴露的方法,Spring將使用JDKjava.lang.reflect.Proxy創(chuàng)建代理。這個(gè)類(lèi)讓Spring動(dòng)態(tài)產(chǎn)生一個(gè)新的類(lèi),它實(shí)現(xiàn)了所需的接口,織入了通知,并且代理目標(biāo)的所有請(qǐng)求。(這篇主要介紹這個(gè)方式)

          2.如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,Spring使用CGLIB庫(kù)生成目標(biāo)對(duì)象的子類(lèi)。在創(chuàng)建這個(gè)子類(lèi)的時(shí)候,Spring將通知織入,并且將對(duì)目標(biāo)對(duì)象的調(diào)用委托給這個(gè)子類(lèi)。

           下面以一個(gè)實(shí)例說(shuō)明Spring AOP的基本開(kāi)發(fā)方法:

          一.創(chuàng)建通知

          Spring連接點(diǎn)模型是建立在方法攔截上,這意味著你編寫(xiě)的Spring通知會(huì)在方法調(diào)用周?chē)母鱾€(gè)地方織入系統(tǒng)中。

          1

              TestAopServiceAdvice實(shí)現(xiàn)了接口MethodBeforeAdvice(前置通知),并實(shí)現(xiàn)它的惟一的方法before,這個(gè)類(lèi)就可以在調(diào)用目標(biāo)對(duì)象前被調(diào)用。同樣的還有AfterReturningAdvice(后置通知)MethodInterceptor(環(huán)繞通知),異常通知(ThrowsAdvice),引入通知等。

              在這個(gè)方法中我們輸出了一個(gè)字符串TestAopServiceAdvice,用于驗(yàn)證這個(gè)方法是否在目標(biāo)對(duì)象前調(diào)用了。

          注意:我們無(wú)法改變before方法中的參數(shù)argstarget中的值,args中存的是原來(lái)要傳入目標(biāo)對(duì)象的變量,target即指目標(biāo)對(duì)象。

           二.配置Spring XML配置文件

          要在Spring中實(shí)現(xiàn)AOP,一般情況下需要配置4個(gè)bean

          1.目標(biāo)對(duì)象(target

          2.通知(advice)

          3.切入點(diǎn)(pointcut)

          4.代理(proxy)

          2

          切入點(diǎn)又分為靜態(tài)切入點(diǎn)和動(dòng)態(tài)切入點(diǎn)
          1、
           靜態(tài)切入點(diǎn)的意思是通知總是被執(zhí)行,
          也是最常用的一種切入點(diǎn)。
          2、
             動(dòng)態(tài)切入點(diǎn)根據(jù)運(yùn)行時(shí)方法的參數(shù)值決定通知是否被執(zhí)行。

          在圖2中,定義了使用了一個(gè)Spring提供的靜態(tài)切入點(diǎn)

              NameMatchMethodPointAdvisor,它保證了當(dāng)被調(diào)用的方法的名字與給出的映射名字相匹配的時(shí)候,這個(gè)切入點(diǎn)才匹配。

             Spring提供的另一個(gè)靜態(tài)切入點(diǎn)為RegexpMethodPointcutAdvisor,讓你可以利用正則表達(dá)式來(lái)定義切入點(diǎn).

           使用ProxyBeanFactory可以創(chuàng)建一個(gè)被通知的類(lèi),即代理對(duì)象。它的最常用的個(gè)控制行為的屬性是:
          1、
          proxyInterfaces
          :代理應(yīng)該實(shí)現(xiàn)的接口列表
          2、
          interceptorNames:需要應(yīng)用到目標(biāo)對(duì)象上的通知Bean的名字。可以是攔截器、Advisor或其他通知類(lèi)的名字。

          注:在用容器的getBean方法時(shí),應(yīng)該是getBean(代理類(lèi)的名字),而不是getBean(目標(biāo)對(duì)象的名字),否則AOP無(wú)法工作。



          posted on 2007-12-02 09:03 々上善若水々 閱讀(1085) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring

          主站蜘蛛池模板: 宣武区| 望城县| 福鼎市| 筠连县| 威远县| 明光市| 太白县| 大渡口区| 贵溪市| 安宁市| 柘城县| 永川市| 丘北县| 额尔古纳市| 大方县| 聂拉木县| 天祝| 东乌| 唐山市| 北安市| 吉林市| 淮安市| 山阴县| 香港 | 始兴县| 日照市| 邵武市| 满洲里市| 淳化县| 陈巴尔虎旗| 民和| 大竹县| 会泽县| 信宜市| 寿阳县| 弋阳县| 石景山区| 万宁市| 庆阳市| 肇东市| 余姚市|