Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解
一、基于注解的AOP之各種通知的使用
1.在切面中,需要通過(guò)指定的注解將方法標(biāo)識(shí)為通知方法
@Before:前置通知,在目標(biāo)對(duì)象方法執(zhí)行之前執(zhí)行
@After:后置通知,在目標(biāo)對(duì)象方法的finally子句中執(zhí)行
@AfterReturning:返回通知,在目標(biāo)對(duì)象方法返回值之后執(zhí)行
@AfterThrowing:異常通知,在目標(biāo)對(duì)象方法的catch子句中執(zhí)行
聲明重用寫(xiě)入點(diǎn)表達(dá)式
@Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))")
public void pointCut() {
}①前置通知
// @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
// @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
@Before("pointCut()")
public void beforeAdviceMethod(JoinPoint joinPoint) {
//獲取連接點(diǎn)所對(duì)應(yīng)方法的簽名信息
Signature signature = joinPoint.getSignature();
//獲取連接點(diǎn)所對(duì)應(yīng)方法的參數(shù)
Object[] args = joinPoint.getArgs();
System.out.println("LoggerAspect,方法:" + signature.getName() + ",參數(shù)" + Arrays.toString(args));
}②后置通知
@After("pointCut()")
public void afterAdviceMethod(JoinPoint joinPoint) {
//獲取連接點(diǎn)所對(duì)應(yīng)方法的簽名信息
Signature signature = joinPoint.getSignature();
System.out.println("LoggerAspect,方法:" + signature.getName() + ",執(zhí)行完畢");
}③返回通知
/**
*在返回通知中若要獲取目標(biāo)對(duì)象方法的返回值
*只需要通過(guò)@AfterReturning注解的returnings屬性
* 就可以將通知方法的某個(gè)參數(shù)指定為接收目標(biāo)對(duì)象方法的返回值的參數(shù)
*/
@AfterReturning(value = "pointCut()",returning = "result")
public void afterReturningAdviceMethod(JoinPoint joinPoint,Object result) {
//獲取連接點(diǎn)所對(duì)應(yīng)方法的簽名信息
Signature signature = joinPoint.getSignature();
System.out.println("LoggerAspect,方法" + signature.getName() + ",結(jié)果:" + result);
}④異常通知
/**
*在異常通知中若要獲取目標(biāo)對(duì)象方法的異常
*只需要通過(guò)@AfterThrowing注解的throwing屬性
* 就可以將通知方法的某個(gè)參數(shù)指定為接收目標(biāo)對(duì)象方法的異常的參數(shù)
*/
@AfterThrowing(value = "pointCut()",throwing = "ex")
public void afterThrowingAdvice(JoinPoint joinPoint,Throwable ex) {
Signature signature = joinPoint.getSignature();
System.out.println("LoggerAspect,方法:" + signature.getName() + ",異常:" + ex);
}二、基于注解的AOP之環(huán)繞通知
環(huán)繞通知:
通過(guò)@Around,然后通過(guò)切入點(diǎn)表達(dá)式定位到連接點(diǎn),然后在環(huán)繞通知的方法中需要傳進(jìn)去一個(gè)參數(shù),叫做ProceedingJoinPoint類型的參數(shù),然后通過(guò)這個(gè)參數(shù)中的一個(gè)方法,proceed()就可以來(lái)表示目標(biāo)方法的執(zhí)行了,然后我們就可以在方法執(zhí)行的過(guò)程中,添加額外的操作了
環(huán)繞通知的方法的返回值,一定要和目標(biāo)對(duì)象方法的返回值一致
@Around("pointCut()")
public Object aroundAdviceMethode(ProceedingJoinPoint joinPoint) {
Object result = null;
try {
System.out.println("環(huán)繞通知-->前置通知");
//表示目標(biāo)對(duì)象方法的執(zhí)行
result = joinPoint.proceed();
System.out.println("環(huán)繞通知-->返回通知");
} catch (Throwable e) {
e.printStackTrace();
System.out.println("環(huán)繞通知-->異常通知");
} finally {
System.out.println("環(huán)繞通知-->后置通知");
}
return result;
}測(cè)試類:
@Test
public void testAOPByAnnotation() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
Calculator calculator = ioc.getBean(Calculator.class);
calculator.div(10,1);
}到此這篇關(guān)于Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Spring各種通知內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21解決方式
這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java:無(wú)效的源發(fā)行版21的解決方式,這個(gè)錯(cuò)誤是因?yàn)槟愕捻?xiàng)目使用的Java版本與你的IDEA使用的Java版本不一致導(dǎo)致的,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn)
這篇文章主要介紹了使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
springboot封裝JsonUtil,CookieUtil工具類代碼實(shí)例
這篇文章主要介紹了springboot封裝JsonUtil,CookieUtil工具類過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java中websocket消息推送的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中websocket消息推送的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
java實(shí)現(xiàn)Object轉(zhuǎn)String的4種方法小結(jié)
這篇文章主要介紹了java實(shí)現(xiàn)Object轉(zhuǎn)String的4種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
Java ThreadLocal的設(shè)計(jì)理念與作用
這篇文章主要介紹了Java ThreadLocal的設(shè)計(jì)理念與作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法
這篇文章給大家分享了Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)單的實(shí)現(xiàn)方法,有興趣的朋友可以參考學(xué)習(xí)下。2018-07-07
如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)
這篇文章主要介紹了如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)的相關(guān)資料,OAuth2.0是一種開(kāi)放的授權(quán)協(xié)議,它允許用戶授權(quán)第三方應(yīng)用訪問(wèn)其賬戶(或資源),而無(wú)需共享其用戶賬戶憑據(jù),需要的朋友可以參考下2023-12-12

