日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

切点、切面:@Aspect、@PointCut相关的个人总结

發(fā)布時(shí)間:2024/2/28 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 切点、切面:@Aspect、@PointCut相关的个人总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自http://blog.51cto.com/12181171/2103016

最近寫的項(xiàng)目里面都用到了很多切面,切點(diǎn)的知識(shí),寫完以后,來(lái)自我總結(jié)一下:

舉個(gè)例子:
一個(gè)類(Show)里面有一個(gè)表演(display)的方法,在表演之前,應(yīng)該有致辭(say)的方法,在表演之后,應(yīng)該有鼓掌(hand)的方法。
為了高內(nèi)聚低耦合,表演的方法應(yīng)該單獨(dú)封裝在一個(gè)類里面,致辭和鼓掌的方法應(yīng)該另外封裝,但在調(diào)用時(shí)必須按照順序來(lái)調(diào)用執(zhí)行。這時(shí)候就需要設(shè)置切面和切點(diǎn)了!

切面應(yīng)該設(shè)置在致辭(say)和鼓掌(hand)方法所在的類上面,同時(shí),要在類里面配置切點(diǎn),類似:

//定義切點(diǎn)--功能權(quán)限更新com.eastcom.bbf.bs.management.service @Pointcut("execution( com.eastcom.bbf.bs.management.service.FunctionRightsService.updateFunctionRight(..))")private void updateFunctionRightPointCut() {// 這是一個(gè)標(biāo)記方法}* 》》即:@PointCut()里面應(yīng)該配置 表演(display)方法的路徑 如果上面沒有定義標(biāo)記方法,則下面的pointcut 應(yīng)該等于"execution(......)"@AfterReturning(pointcut = "updateFunctionRightPointCut()",returning = "rvt")public void afterUpdateFunctionRight(JoinPoint joinPoint,String rvt) {**// 此方法是在切入點(diǎn)方法執(zhí)行之后執(zhí)行**// joinPoint.getArgs() 就是獲取切入點(diǎn)方法的入?yún)?/ rvt 就是切入點(diǎn)方法的返回值..............》》此方法相當(dāng)于 鼓掌(hand)方法。} @Before("updateFunctionRightPointCut()")public void beforeSaveServiceNode(JoinPoint joinPoint) {** // 此方法在切入點(diǎn)之前執(zhí)行**ServiceNode node = (ServiceNode) joinPoint.getArgs()[0];.............》》此方法相當(dāng)于 致辭(say) 方法。}

這樣配置完成時(shí),在調(diào)用display(切入點(diǎn))方法時(shí),就會(huì)自動(dòng)調(diào)用致辭(say)和鼓掌(hand)方法了。

測(cè)試類似代碼時(shí),應(yīng)該在切點(diǎn)的方法里面打斷點(diǎn),然后在想要執(zhí)行的方法里面打斷點(diǎn)。

?

此外,在項(xiàng)目中遇到一個(gè)問題就是,調(diào)用不到一個(gè)類中的一個(gè)方法。然后也可以通過(guò)設(shè)置切點(diǎn)、切面來(lái)解決。
如:
XXFilter類里面有個(gè) updateInit()方法,因?yàn)槭莊ilter不能自動(dòng)注入,外面無(wú)法調(diào)用這個(gè)方法。br/>解決:
自己寫一個(gè)XXService類(設(shè)置自動(dòng)注入@Service),在里面定義一個(gè)update()方法,方法體內(nèi)為空,
在XXFilter類上面設(shè)置@Aspect,在里面設(shè)置@PointCut(“execution(update()方法的路徑)”),
然后

@AfterReturning(...) void xxUpdate(){// 在里面只是調(diào)用updateInit()方法。updateInit( ) }

這樣就可以通過(guò) XXService調(diào)用update()方法來(lái)調(diào)用updateInit()方法了。

  • 通知、增強(qiáng)處理(Advice): 就是你想要的功能,你給先定義好,然后在想用的地方用一下,包含Aspect的一段處理代碼。
  • 連接點(diǎn)(JoinPoint): 就是spring允許你是通知(Advice)的地方,基本每個(gè)方法的前、后(兩者都有也行),或拋出異常時(shí)都可以是連接點(diǎn),spring只支持方法連接點(diǎn)。其他如AspectJ還可以讓你在構(gòu)造器或?qū)傩宰⑷霑r(shí)都行,不過(guò)只要記住,和方法有關(guān)的前前后后都是連接點(diǎn)。連接點(diǎn)就是為了獲取切點(diǎn)方法的相關(guān)信息(所在的類、入?yún)ⅰ⒎椒ǖ?#xff09;
  • 切入點(diǎn)(Pointcut) :上面說(shuō)的連接點(diǎn)的基礎(chǔ)上,來(lái)定義切入點(diǎn),你的一個(gè)類里,有15個(gè)方法,那就有十幾個(gè)連接點(diǎn)了,但是并不想在所有方法附近都使用通知(使用叫織入),只是想讓其中幾個(gè),在調(diào)用這幾個(gè)方法之前、之后或者拋出異常時(shí)干點(diǎn)什么,那么就用切入點(diǎn)來(lái)定義這幾個(gè)方法,讓切點(diǎn)來(lái)篩選連接點(diǎn),選中那幾個(gè)你想要的方法。
  • 切面(Aspect) :切面是通知和切入點(diǎn)的結(jié)合。連接點(diǎn)就是為了方便理解切點(diǎn)的,明白這個(gè)概念就行了。通知說(shuō)明了干什么和什么時(shí)候干(什么時(shí)候通過(guò)方法名中的befor,after,around等就能知道),切入點(diǎn)說(shuō)明了在哪干(指定到底是哪個(gè)方法),這就是一個(gè)完整的切面定義。
  • @Aspect //聲明切面,標(biāo)記類 public class Wly { @Pointcut("execution(* *.perform(..))") //定義切點(diǎn),標(biāo)記方法 public void performance() {} @Before("performance()") //切點(diǎn)之前執(zhí)行 public .... @AfterReturning("performance()") //切點(diǎn)執(zhí)行成功之后執(zhí)行 public ... // @After("....") // 在切點(diǎn)之后執(zhí)行,無(wú)論方法執(zhí)行成功與否@AfterThrowing("performance()") //切點(diǎn)拋出異常后執(zhí)行 public ... }

    總結(jié)

    以上是生活随笔為你收集整理的切点、切面:@Aspect、@PointCut相关的个人总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。