javascript
Spring Aop 5种通知写法及参数JoinPoint详解
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è)方法:
由于AOP代理原理是直接添加字節(jié)碼文件,不創(chuàng)建新的對(duì)象。所以getThis()和getTarget()獲取到的是同一個(gè)對(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è)新的方法:
好了 基本已經(jīng)講完,歡迎大家評(píng)論區(qū)指出不足,一起學(xué)習(xí)進(jìn)步!
大家看完了點(diǎn)個(gè)贊,碼字不容易啊。。。
總結(jié)
以上是生活随笔為你收集整理的Spring Aop 5种通知写法及参数JoinPoint详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器人建模中移动关节如何建立坐标系_简述
- 下一篇: @SpringBootTest Cano