基于SpringAop中JoinPoint對(duì)象的使用說明
JoinPoint 對(duì)象
JoinPoint對(duì)象封裝了SpringAop中切面方法的信息,在切面方法中添加JoinPoint參數(shù),就可以獲取到封裝了該方法信息的JoinPoint對(duì)象。
常用api:
| 方法名 | 功能 |
|---|---|
| Signature getSignature(); | 獲取封裝了署名信息的對(duì)象,在該對(duì)象中可以獲取到目標(biāo)方法名,所屬類的Class等信息 |
| Object[] getArgs(); | 獲取傳入目標(biāo)方法的參數(shù)對(duì)象 |
| Object getTarget(); | 獲取被代理的對(duì)象 |
| Object getThis(); | 獲取代理對(duì)象 |
ProceedingJoinPoint對(duì)象
ProceedingJoinPoint對(duì)象是JoinPoint的子接口,該對(duì)象只用在@Around的切面方法中。
添加了
Object proceed() throws Throwable //執(zhí)行目標(biāo)方法 Object proceed(Object[] var1) throws Throwable //傳入的新的參數(shù)去執(zhí)行目標(biāo)方法
兩個(gè)方法.
Demo
切面類
@Aspect
@Component
public class aopAspect {
/**
* 定義一個(gè)切入點(diǎn)表達(dá)式,用來確定哪些類需要代理
* execution(* aopdemo.*.*(..))代表aopdemo包下所有類的所有方法都會(huì)被代理
*/
@Pointcut("execution(* aopdemo.*.*(..))")
public void declareJoinPointerExpression() {}
/**
* 前置方法,在目標(biāo)方法執(zhí)行前執(zhí)行
* @param joinPoint 封裝了代理方法信息的對(duì)象,若用不到則可以忽略不寫
*/
@Before("declareJoinPointerExpression()")
public void beforeMethod(JoinPoint joinPoint){
System.out.println("目標(biāo)方法名為:" + joinPoint.getSignature().getName());
System.out.println("目標(biāo)方法所屬類的簡單類名:" + joinPoint.getSignature().getDeclaringType().getSimpleName());
System.out.println("目標(biāo)方法所屬類的類名:" + joinPoint.getSignature().getDeclaringTypeName());
System.out.println("目標(biāo)方法聲明類型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));
//獲取傳入目標(biāo)方法的參數(shù)
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("第" + (i+1) + "個(gè)參數(shù)為:" + args[i]);
}
System.out.println("被代理的對(duì)象:" + joinPoint.getTarget());
System.out.println("代理對(duì)象自己:" + joinPoint.getThis());
}
/**
* 環(huán)繞方法,可自定義目標(biāo)方法執(zhí)行的時(shí)機(jī)
* @param pjd JoinPoint的子接口,添加了
* Object proceed() throws Throwable 執(zhí)行目標(biāo)方法
* Object proceed(Object[] var1) throws Throwable 傳入的新的參數(shù)去執(zhí)行目標(biāo)方法
* 兩個(gè)方法
* @return 此方法需要返回值,返回值視為目標(biāo)方法的返回值
*/
@Around("declareJoinPointerExpression()")
public Object aroundMethod(ProceedingJoinPoint pjd){
Object result = null;
try {
//前置通知
System.out.println("目標(biāo)方法執(zhí)行前...");
//執(zhí)行目標(biāo)方法
//result = pjd.proeed();
//用新的參數(shù)值執(zhí)行目標(biāo)方法
result = pjd.proceed(new Object[]{"newSpring","newAop"});
//返回通知
System.out.println("目標(biāo)方法返回結(jié)果后...");
} catch (Throwable e) {
//異常通知
System.out.println("執(zhí)行目標(biāo)方法異常后...");
throw new RuntimeException(e);
}
//后置通知
System.out.println("目標(biāo)方法執(zhí)行后...");
return result;
}
}
被代理類
/**
* 被代理對(duì)象
*/
@Component
public class TargetClass {
/**
* 拼接兩個(gè)字符串
*/
public String joint(String str1, String str2) {
return str1 + "+" + str2;
}
}
測試類
public class TestAop {
@Test
public void testAOP() {
//1、創(chuàng)建Spring的IOC的容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:bean.xml");
//2、從IOC容器中獲取bean的實(shí)例
TargetClass targetClass = (TargetClass) ctx.getBean("targetClass");
//3、使用bean
String result = targetClass.joint("spring","aop");
System.out.println("result:" + result);
}
}
輸出結(jié)果
目標(biāo)方法執(zhí)行前...
目標(biāo)方法名為:joint
目標(biāo)方法所屬類的簡單類名:TargetClass
目標(biāo)方法所屬類的類名:aopdemo.TargetClass
目標(biāo)方法聲明類型:public
第1個(gè)參數(shù)為:newSpring
第2個(gè)參數(shù)為:newAop
被代理的對(duì)象:aopdemo.TargetClass@4efc180e
代理對(duì)象自己:aopdemo.TargetClass@4efc180e
目標(biāo)方法返回結(jié)果后...
目標(biāo)方法執(zhí)行后...
result:newSpring+newAop
SpringAop 通知參數(shù)JoinPoint的幾個(gè)常用API
1.獲取類名
String className = joinPoint.getSignature().getDeclaringTypeName();
2.獲取方法名
String methodName = joinPoint.getSignature().getName();
3.獲取返回值類型
MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature(); Class clazz = methodSignature.getReturnType();
如果是環(huán)繞通知參數(shù)ProceedingJoinPoint則有
4.執(zhí)行目標(biāo)方法
joinPoint.proceed();
5.執(zhí)行目標(biāo)方法,替換入?yún)?/h3>
proceed(java.lang.Object[] args)
proceed(java.lang.Object[] args)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)
這篇文章主要介紹了Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Spring Cloud下OAUTH2注銷的實(shí)現(xiàn)示例
本篇文章主要介紹了Spring Cloud下OAUTH2注銷的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作
這篇文章主要介紹了java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
springboot實(shí)現(xiàn)全局異常捕獲的使用示例
任何系統(tǒng),我們不會(huì)傻傻的在每一個(gè)地方進(jìn)行異常捕獲和處理,整個(gè)系統(tǒng)一般我們會(huì)在一個(gè)的地方統(tǒng)一進(jìn)行異常處理,本文主要介紹了springboot實(shí)現(xiàn)全局異常捕獲的使用示例,感興趣的可以了解一下2023-11-11
Java中定時(shí)任務(wù)的全方位場景實(shí)現(xiàn)思路分析
在開發(fā)過程中,根據(jù)需求和業(yè)務(wù)的不同經(jīng)常會(huì)有很多場景需要用到不同特性的定時(shí)任務(wù),本文將針對(duì)這些場景,提供不同的一個(gè)實(shí)現(xiàn)思路,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12
關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析
這篇文章主要給大家介紹了關(guān)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09

