摘要:前置通知返回通知當(dāng)匹配的方法執(zhí)行正常返回時(shí)運(yùn)行獲取返回值當(dāng)我們想獲取到某個(gè)方法的返回值時(shí)可以使用如下方式表示返回值類型這里使用的是類型我們也可以設(shè)置指定類型例如異常通知表示當(dāng)拋出的是異常時(shí)才會(huì)調(diào)用此方法后置通知當(dāng)匹配的方法執(zhí)行完成后運(yùn)行圍繞
@Before 前置通知
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class BeforeExample { @Before("execution(* com.xyz.myapp.dao.*.*(..))") public void doAccessCheck() { // ... } }@AfterReturning 返回通知
當(dāng)匹配的方法執(zhí)行正常返回時(shí)運(yùn)行.
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterReturning; @Aspect public class AfterReturningExample { @AfterReturning("execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())") public void doAccessCheck() { // ... } }獲取返回值
當(dāng)我們想獲取到某個(gè)方法的返回值時(shí), 可以使用如下方式:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterReturning; @Aspect public class AfterReturningExample { @AfterReturning( pointcut="execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())", returning="retVal") public void doAccessCheck(Object retVal) { // ... } }
returning 表示返回值類型, 這里使用的是 Object 類型, 我們也可以設(shè)置指定類型 例如 List
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.AfterThrowing; @Aspect public class AfterThrowingExample { @AfterThrowing( pointcut="execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())", throwing="ex") public void doRecoveryActions(DataAccessException ex) { // ... } }
throwing 表示當(dāng)拋出的是 DataAccessException 異常時(shí), 才會(huì)調(diào)用此方法.
@After 后置通知當(dāng)匹配的方法執(zhí)行完成后運(yùn)行.
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.After; @Aspect public class AfterFinallyExample { @After("execution(* com.xyz.myapp.SystemArchitecture.dataAccessOperation())") public void doReleaseLock() { // ... } }@Around 圍繞通知
在匹配的方法執(zhí)行前后執(zhí)行.
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect public class AroundExample { @Around("execution(* com.example.demo.sss.TestService.*())") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("執(zhí)行目標(biāo)方法之前..."); Object retVal = pjp.proceed(); System.out.println("執(zhí)行目標(biāo)方法之后..."); return retVal + " ---> 1111"; } }
該方法的第一個(gè)形參必須是 ProceedingJoinPoint 類型, 在方法體中調(diào)用 proceed 方法才會(huì)執(zhí)行目標(biāo)方法; 如果程序沒有調(diào)用 proceed 方, 目標(biāo)方法不會(huì)執(zhí)行.
調(diào)用 proceed 方法時(shí), 還可以傳入一個(gè) Object[] 對(duì)象, 該數(shù)組中的值將被傳入目標(biāo)方法作為實(shí)參. 如果傳入的 Object[] 數(shù)組長度與目標(biāo)方法所需要的參數(shù)個(gè)數(shù)不相等, 或者 Object[] 數(shù)組元素與目標(biāo)方法所需參數(shù)的類型不匹配, 程序就會(huì)拋出異常.
獲取通知參數(shù)任何通知方法都可以聲明一個(gè)類型為 org.aspectj.lang.JoinPoint 的參數(shù), 作為它的第一個(gè)參數(shù) JoinPoint 接口提供了許多有用的方法:
getArgs(): 返回方法參數(shù).
getThis(): 返回代理對(duì)象.
getTarget(): 返回目標(biāo)對(duì)象.
getSignature(): 返回建議的方法的描述.
toString(): 打印建議方法的描述.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72541.html
摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...
摘要:入門和學(xué)習(xí)筆記概述框架的核心有兩個(gè)容器作為超級(jí)大工廠,負(fù)責(zé)管理創(chuàng)建所有的對(duì)象,這些對(duì)象被稱為。中的一些術(shù)語切面切面組織多個(gè),放在切面中定義。 Spring入門IOC和AOP學(xué)習(xí)筆記 概述 Spring框架的核心有兩個(gè): Spring容器作為超級(jí)大工廠,負(fù)責(zé)管理、創(chuàng)建所有的Java對(duì)象,這些Java對(duì)象被稱為Bean。 Spring容器管理容器中Bean之間的依賴關(guān)系,使用一種叫做依賴...
摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...
摘要:使用與的靜態(tài)代理不同,使用的動(dòng)態(tài)代理,所謂的動(dòng)態(tài)代理就是說框架不會(huì)去修改字節(jié)碼,而是在內(nèi)存中臨時(shí)為方法生成一個(gè)對(duì)象,這個(gè)對(duì)象包含了目標(biāo)對(duì)象的全部方法,并且在特定的切點(diǎn)做了增強(qiáng)處理,并回調(diào)原對(duì)象的方法。 AOP(Aspect Orient Programming),我們一般稱為面向方面(切面)編程,作為面向?qū)ο蟮囊环N補(bǔ)充,用于處理系統(tǒng)中分布于各個(gè)模塊的橫切關(guān)注點(diǎn),比如事務(wù)管理、日志、緩存...
摘要:介紹什么是在軟件業(yè),為的縮寫,意為面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。切面是切入點(diǎn)和通知引介的結(jié)合。切面類權(quán)限校驗(yàn)。。。 1. AOP 1.1 AOP介紹 1.1.1 什么是AOP 在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)...
摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時(shí)間閱讀了方面的源碼。從今天開始,我將對(duì)部分的源碼分析系列文章進(jìn)行更新。全稱是,即面向切面的編程,是一種開發(fā)理念。在中,切面只是一個(gè)概念,并沒有一個(gè)具體的接口或類與此對(duì)應(yīng)。 1. 簡介 前一段時(shí)間,我學(xué)習(xí)了 Spring IOC 容器方面的源碼,并寫了數(shù)篇文章對(duì)此進(jìn)行講解。在寫完 Spring IOC 容器源碼分析系列...
閱讀 2810·2023-04-25 23:08
閱讀 1601·2021-11-23 09:51
閱讀 1584·2021-10-27 14:18
閱讀 3127·2019-08-29 13:25
閱讀 2840·2019-08-29 13:14
閱讀 2918·2019-08-26 18:36
閱讀 2204·2019-08-26 12:11
閱讀 824·2019-08-26 11:29