Spring Aop 應(yīng)用(二):@annotation()

在上一節(jié)中,講到了三個(gè)注解@Around @Before @After,通過(guò)這些操作可以在方法執(zhí)行前后執(zhí)行某些操作。如果我們有個(gè)方法想實(shí)現(xiàn)aop,根據(jù)我們上節(jié)所講的,要先找到切入點(diǎn),然后再對(duì)這個(gè)切入點(diǎn)進(jìn)行前后操作。從上面的邏輯可以看出,我們每次想要方法實(shí)現(xiàn)aop就要都要做一些重復(fù)的操作,大大影響力代碼的簡(jiǎn)潔和可讀性。
首先我們?cè)O(shè)想一下有沒(méi)有一種方法,只要我們?cè)谙胍獙?shí)現(xiàn)aop的方法上面加個(gè)標(biāo)記就能實(shí)現(xiàn)aop的功能。是的大家可能想到了,這個(gè)標(biāo)記就是注解。

原始切面定義:

@Aspect
@Component
public class AopServiceImpl {

    @Pointcut("execution(* com.aop.aop.controller..*(..))")
    public void record(){
        System.out.println("hahahha");
    }

    @Before("record()")
    public void before(){
        System.out.println("before................");
    }
    }

從代碼可以看出,切點(diǎn)指向的是個(gè)范圍,在此范圍內(nèi)所有的方法都實(shí)現(xiàn)了Aop,在實(shí)際開(kāi)發(fā)中我們可能只需要某各類(lèi)中的某個(gè)方法實(shí)現(xiàn)aop,因此我們可以將切點(diǎn)Pointcut精確到某個(gè)方法

@Pointcut("execution(* com.aop.aop.controller.SysController.sayHello())")
    public void record(){
        System.out.println("hahahha");
    }

 @Before("record()")
 public void before(){
     System.out.println("before................");
 }

一個(gè)方法還好只需定義一次,如果多個(gè)方法需要使用同一個(gè)advice,就要聲明多個(gè)切點(diǎn),顯然這種方法會(huì)造成大量重復(fù)代碼影響代碼可讀性。為了解決此類(lèi)問(wèn)題我們引入@annotation()
我們先定義一個(gè)注解:

@Target({ElementType.METHOD}) //聲明注解作用在方法上面
@Retention(RetentionPolicy.RUNTIME) //注解保留至運(yùn)行時(shí) 
public @interface AopInter {

}

改良后的advice

@Aspect
@Component
public class NewAopSerivceImpl {

    @Before("@annotation(com.aop.aop.AopInter)") //該advice作用在有@AopInter注解的方法下面
    public void before(){
        System.out.println("before................");
    }

}

測(cè)試執(zhí)行sayHello,與syGoodBye

@Controller
public class SysController {

    @GetMapping("/sayHello")
    @ResponseBody
    public String sayHello(){
        System.out.println("執(zhí)行結(jié)果................hello");
        return "hello";
    }

    @GetMapping("/syGoodBye")
    @AopInter
    public String syGoodBye(){
        System.out.println("執(zhí)行結(jié)果................goodBye");
        return "goodBye";
    }

}

結(jié)果

執(zhí)行結(jié)果................hello
before................
執(zhí)行結(jié)果................goodBye

可以看出syGoodBye使用該adivce,sayHello并沒(méi)有使用。因此如果有方法想使用該adivce只需加上@AopInter注解即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書(shū)筆記,整理的知識(shí)點(diǎn),也是為了防止忘記,尊重勞動(dòng)成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 12,440評(píng)論 6 86
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評(píng)論 25 709
  • SpringAOP的使用Demo 通過(guò)配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 S...
    獨(dú)念白閱讀 526評(píng)論 0 5
  • 機(jī)會(huì)成本023 概念 機(jī)會(huì)成本是指為了A而所要放棄B的最大價(jià)值;也可以理解為在面臨多方案擇一決策時(shí),被舍棄的選項(xiàng)中...
    11_18閱讀 276評(píng)論 0 1
  • 所謂自卑,在心理學(xué)上特指由于與合理規(guī)定標(biāo)準(zhǔn)或其他刺激物比較有差距,而產(chǎn)生了評(píng)價(jià)差異,進(jìn)而導(dǎo)致的主觀低落、悲...
    趙卿恬閱讀 1,390評(píng)論 0 2

友情鏈接更多精彩內(nèi)容