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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Aop 5种通知写法及参数JoinPoint详解

發(fā)布時(shí)間:2023/12/16 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Aop 5种通知写法及参数JoinPoint详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring Aop切面參數(shù)JoinPoint詳解

鏈接: 關(guān)于代理的一些基礎(chǔ)知識(shí)(非必看).

Spring Aop切面參數(shù)JoinPoint詳解

  • Spring Aop切面參數(shù)JoinPoint詳解
    • Spring Aop5種代理通知的寫(xiě)法:
      • 1.前置通知
      • 2.后置通知
      • 3.返回后通知
      • 4.異常通知
      • 5.環(huán)繞通知
    • JoinPoint是什么:
      • Signature 是什么:
    • ProceedingJoinPoint是什么:

Spring Aop5種代理通知的寫(xiě)法:

1.前置通知

@Before("method()")public void doBeforeAdvice(JoinPoint joinPoint){System.out.println("我是前置通知!!!");}

2.后置通知

@After("method()")public void returnAfter(JoinPoint joinPoint){System.out.println("我是后置通知!!!");}

3.返回后通知

@AfterReturning(value="method()",returning = "result")public void afterReturning(JoinPoint joinPoint,Object result){System.out.println("我是返回后通知!!!返回值是:"+result);}

4.異常通知

@AfterThrowing(value = "method()",throwing = "ex")public void afterThrowing(JoinPoint joinPoint,Exception ex){System.out.println("我是異常通知!!!異常是::"+ex);}

5.環(huán)繞通知

@Around(value = "method()")public Object aroundLogging(ProceedingJoinPoint joinPoint){System.out.println("我是環(huán)繞通知");joinPoint.proceed(); //調(diào)用目標(biāo)方法System.out.println("我是環(huán)繞通知");return true;}

?

JoinPoint是什么:

JoinPoint對(duì)象封裝了SpringAop中切面方法的信息,在切面方法中添加JoinPoint參數(shù),就可以獲取到封裝了該方法信息的JoinPoint對(duì)象.
我們看看常用的幾個(gè)方法:

public interface JoinPoint {Object getThis();Object getTarget();Object[] getArgs();Signature getSignature();}
  • getThis():獲取當(dāng)前對(duì)象(代理對(duì)象)
  • getTarget():獲取被代理對(duì)象
    由于AOP代理原理是直接添加字節(jié)碼文件,不創(chuàng)建新的對(duì)象。所以getThis()和getTarget()獲取到的是同一個(gè)對(duì)象。
  • getArgs():獲取被代理方法的參數(shù),返回Object[]。
  • getSignature():返回Signature 對(duì)象。
  • 其他的一些api:

    System.out.println("目標(biāo)方法名為:" + joinPoint.getSignature().getName()); System.out.println("目標(biāo)方法所屬類(lèi)的簡(jiǎn)單類(lèi)名:" + joinPoint.getSignature().getDeclaringType().getSimpleName()); System.out.println("目標(biāo)方法所屬類(lèi)的類(lèi)名:" + joinPoint.getSignature().getDeclaringTypeName()); System.out.println("目標(biāo)方法聲明類(lèi)型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));

    Signature 是什么:

    Signature 封裝了被代理方法的全部信息(方法命、注解),以及該方法所屬類(lèi)的信息。


    可以看到,Signature 是一個(gè)父級(jí)接口,它有數(shù)十個(gè)實(shí)現(xiàn)類(lèi)。我們這里模擬一下獲取被代理方法的方法對(duì)象:


    獲取到了方法對(duì)象之后,我們就可以調(diào)用api,獲取方法的所有信息,甚至可以調(diào)用.invoke()直接調(diào)用方法:

    ?

    ProceedingJoinPoint是什么:

    我們注意到,在環(huán)繞通知中,參數(shù)是ProceedingJoinPoint:

    @Around(value = "method()")public Object aroundLogging(ProceedingJoinPoint joinPoint){System.out.println("我是環(huán)繞通知");joinPoint.proceed(); //調(diào)用目標(biāo)方法System.out.println("我是環(huán)繞通知");return true;}

    我們進(jìn)去看看ProceedingJoinPoint 的源碼:


    我們發(fā)現(xiàn)ProceedingJoinPoint 是繼承了JoinPoint,作為子接口(擴(kuò)展了兩個(gè)方法)。
    為什么呢?因?yàn)镻roceedingJoinPoint 是專(zhuān)為環(huán)繞通知服務(wù)的,既然是環(huán)繞通知,那么調(diào)用被代理方法的動(dòng)作就必須我們手動(dòng)觸發(fā)了,所以ProceedingJoinPoint 增加了兩個(gè)新的方法:

  • proceed():調(diào)用被代理方法(無(wú)參)
  • proceed(Object[] var1):調(diào)用被代理方法(有參)
  • 好了 基本已經(jīng)講完,歡迎大家評(píng)論區(qū)指出不足,一起學(xué)習(xí)進(jìn)步!

    大家看完了點(diǎn)個(gè)贊,碼字不容易啊。。。

    總結(jié)

    以上是生活随笔為你收集整理的Spring Aop 5种通知写法及参数JoinPoint详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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