[TOC] 1. 創建並聲明一個切麵 1. 首先,創建一個類,添加 註解使其添加到IoC容器 2. 然後,添加 註解,使其成為一個切麵 3. 最後,在配置文件裡面,使用``來使其生效 2. 使用切麵的通知 切麵總共有 6 個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知 ...
[TOC]
1. 創建並聲明一個切麵
- 首先,創建一個類,添加
@Component
註解使其添加到IoC容器 - 然後,添加
@Aspect
註解,使其成為一個切麵 - 最後,在配置文件裡面,使用
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
來使其生效
2. 使用切麵的通知
切麵總共有6個通知類型,其中五個常用的為:前置通知、後置通知、返回通知、異常通知、環繞通知,一個不常用的為:引入通知。
而在五個常用的通知里,環繞通知功能最為強大,可以實現前四個的功能。
- 前置通知
- 添加
@Before
並指定註解參數:@Before(value = "execution(permission returnType packageName.className.methodName(parameters))")
函數參數為:
JoinPoint
- 後置通知
- 添加
@After
並指定註解參數:@After(value = "execution(permission returnType packageName.className.methodName(parameters))")
- 函數參數為:
JoinPoint
- 返回通知
- 添加
@AfterReturning
並指定註解參數:@AfterReturning(value = "execution(permission returnType packageName.className.methodName(parameters))",returning="result")
- 函數參數為:
JoinPoint, Object
- 異常通知
- 添加
@AfterThrowing
並指定註解參數:@AfterThrowing(value = "execution(permission returnType packageName.className.methodName(parameters))")
函數參數為:
JoinPoint
- 環繞通知
- 添加
@Around
並指定註解參數:@Around(value = "execution(permission returnType packageName.className.methodName(parameters))")
- 函數參數為:
ProceedingJoinPoint
函數返回值為:
Object
首先,上面代碼中的名詞為:
- permission為訪問許可權
- retrunType為返回值類型
- packageName為目標(切入對象)的包限定名
- className為目標的類名
- methodName為橫切關註點(關註函數)的名字
- parameters為關註點傳入的參數(只寫類型即可)
其次,上面的註解都有一個隱藏的參數argNames
,此參數可確定傳入參數的順序
3. 定義切麵的優先順序
當一個橫切關註點有多個切麵時,我們可能會需要明確切麵的執行順序,此時我們就需要@Order
註解來完成這個工作。
- 首先,明確我們的切麵執行順序
- 然後,在切麵的類註解上添加
@Order
註解 - 最後,為
@Order
註解指明參數,比如@Order(1)
註意:參數越小,優先順序越高
4. 使用切入點表達式
可能在某種需求下,我們需要為一個關註點織入多個切麵、多種通知,那麼此時按照上面的做法,為每一個通知函數指定execution
會顯得很麻煩,這個時候我們就會用到切入點表達式了。切入點表達式看上去就是一個加了註解的方法,使用時調用該方法就是了。
使用切入點表達式需要按照以下步驟:
- 選擇本類或者新建一個專門的切麵配置類來容納切入點表達式
- 聲明一個方法比如為
public void cut(){}
,添加@Pointcut
註解 - 像普通的那樣為其指明參數
@Pointcut(value = "execution(permission returnType packageName.className.methodName(parameters))")
- 在本類中使用,則在原來通知的value屬性上指定該函數即可,比如
@Before(value = "cut()")
- 在其他類中使用,則需要在方法名前加上該方法的所屬類名,比如
@Before(value = "className.cut()")
所以,推薦在切麵所在包下創建一個切麵配置類,而不是所有包共用一個配置類。
需要註意的是,@Pointcut
註解沒有returning
參數,故不能帶返回值