切点、切面:@Aspect、@PointCut相关的个人总结
轉(zhuǎn)載自http://blog.51cto.com/12181171/2103016
最近寫的項目里面都用到了很多切面,切點的知識,寫完以后,來自我總結(jié)一下:
舉個例子:
一個類(Show)里面有一個表演(display)的方法,在表演之前,應(yīng)該有致辭(say)的方法,在表演之后,應(yīng)該有鼓掌(hand)的方法。
為了高內(nèi)聚低耦合,表演的方法應(yīng)該單獨封裝在一個類里面,致辭和鼓掌的方法應(yīng)該另外封裝,但在調(diào)用時必須按照順序來調(diào)用執(zhí)行。這時候就需要設(shè)置切面和切點了!
切面應(yīng)該設(shè)置在致辭(say)和鼓掌(hand)方法所在的類上面,同時,要在類里面配置切點,類似:
//定義切點--功能權(quán)限更新com.eastcom.bbf.bs.management.service @Pointcut("execution( com.eastcom.bbf.bs.management.service.FunctionRightsService.updateFunctionRight(..))")private void updateFunctionRightPointCut() {// 這是一個標(biāo)記方法}* 》》即:@PointCut()里面應(yīng)該配置 表演(display)方法的路徑 如果上面沒有定義標(biāo)記方法,則下面的pointcut 應(yīng)該等于"execution(......)"@AfterReturning(pointcut = "updateFunctionRightPointCut()",returning = "rvt")public void afterUpdateFunctionRight(JoinPoint joinPoint,String rvt) {**// 此方法是在切入點方法執(zhí)行之后執(zhí)行**// joinPoint.getArgs() 就是獲取切入點方法的入?yún)?/ rvt 就是切入點方法的返回值..............》》此方法相當(dāng)于 鼓掌(hand)方法。} @Before("updateFunctionRightPointCut()")public void beforeSaveServiceNode(JoinPoint joinPoint) {** // 此方法在切入點之前執(zhí)行**ServiceNode node = (ServiceNode) joinPoint.getArgs()[0];.............》》此方法相當(dāng)于 致辭(say) 方法。}這樣配置完成時,在調(diào)用display(切入點)方法時,就會自動調(diào)用致辭(say)和鼓掌(hand)方法了。
測試類似代碼時,應(yīng)該在切點的方法里面打斷點,然后在想要執(zhí)行的方法里面打斷點。
?此外,在項目中遇到一個問題就是,調(diào)用不到一個類中的一個方法。然后也可以通過設(shè)置切點、切面來解決。
如:
XXFilter類里面有個 updateInit()方法,因為是filter不能自動注入,外面無法調(diào)用這個方法。br/>解決:
自己寫一個XXService類(設(shè)置自動注入@Service),在里面定義一個update()方法,方法體內(nèi)為空,
在XXFilter類上面設(shè)置@Aspect,在里面設(shè)置@PointCut(“execution(update()方法的路徑)”),
然后
這樣就可以通過 XXService調(diào)用update()方法來調(diào)用updateInit()方法了。
總結(jié)
以上是生活随笔為你收集整理的切点、切面:@Aspect、@PointCut相关的个人总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMq入门以及使用教程
- 下一篇: Concurrent——Atomic原子