Spring Aop 切面的應用 註解

2021-10-01 18:29:40 字數 4047 閱讀 5565

本次記錄的是使用spring註解的方式來實現切面程式設計.

實現環境: 設定乙個分布式鎖, 在修改資料的時候, 判斷鎖, 加鎖, 完成資料修改後, 釋放鎖.

自定義乙個鎖註解, 新增到方法上, 在執行方法前根據引數設定鎖key,

@target()

@retention

(retentionpolicy.runtime)

public @inte***ce

ylock

; class[

]paramkeytype()

default

;/** 拼接符 */

string splice()

default

"_";

/** 鎖的型別, trylock(嘗試鎖), is_lock(判斷鎖) */

locktype locktype()

;/**

* 鎖的key值字首

* @return int

*/string lockkeyprefix()

default"";

}

在執行的時候, 優先判斷是否存在鎖註解, 存在的話進入判斷鎖.

@restcontroller

@slf4j

public

class

lockannotatiopcontroller

("/test/lock/error"

)@ylock

(locktype = locktype.is_lock, lockkey =

"age"

)public responsemodel testerror

(string type, lockusertest lockuser)

}

使用@aspect來建立切面;

使用@component來建立例項bean並交給spring來管理;

常用的註解

@pointcut : 設定切入點;

@around : 環繞執行, 方法執行前, 和 方法執行後;

@before : 方法執行前;

@after : 方法執行後;

@afterreturning : 方法返回後;

@afterthrowing : 方法有異常丟擲時;

# 執行順序

around > befor > arounderror > arroundfinally > arroundafter > after > afterreturning or afterthrowing

@pointcut

1. 可以用來設定切入點, 可以使用萬用字元來配置;

2. 註解方法 : @pointcut("@annotation(com.py.common.lock.annotatiop.ylock)")

3. 使用萬用字元 : @pointcut("execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)

") - 可以是類路徑匹配;

- 可以是方法名稱匹配;

- 可以是param引數;

- 可以是異常型別匹配;

例如:

類路徑

userservice下的任意方法都會執行

@pointcut

("execution(* com.py.service.userservice.*(..))"

)

service包下的所有子包和所有類的所有方法都會執行

@pointcut

("execution(* com.py.service..*.*(..))"

)/**

* 第乙個.. 表示所有的子包

* 第乙個 * 表示所有類

* 第二個 * 表示所有的方法

* 第二個 .. 表示方法的任意引數個數

* /

方法名

所有的public方法

@pointcut

("execution(public * *(..))"

)

所有update開頭的方法

@pointcut

("execution(* update*(..))"

)

環繞執行, 需要引入引數

proceedingjoinpoint joinpoint

proceed() : 通過執行

getargs() : 獲得請求引數object

可以再方法執行前, 和執行後進行編輯, 也可以抓取異常.

after在執行後呼叫, 還有另外兩個 afterreturn 和 afterthrowing,

@after : 在任何情況下都會執行;

@afterreturn : 在切入點有返回值的時候執行;

@afterthrowing : 在切點丟擲異常錯誤的時候執行;

@afterreturn 和 @afterthrowing只會執行其中乙個;

**如下

@component

@aspect

@slf4j

public

class

distributedlockaop

@before

(value =

"annotationpoincut()"

)public

void

before

(joinpoint joinpoint)

@after

(value =

"annotationpoincut()"

)public

void

after

(joinpoint joinpoint)

@afterreturning

(value =

"annotationpoincut()"

)public

void

afterreturning

(joinpoint joinpoint)

@afterthrowing

(value =

"annotationpoincut()"

)public

void

afterthrowing

(joinpoint joinpoint)

@around

(value =

"annotationpoincut()"

)public

void

around

(proceedingjoinpoint joinpoint)

throws throwable catch (throwable throwable) finally */

log.

info

("lockaop around. after");

}}

上面的controller執行的日誌輸入如下;

# /test/lock/name

around. befor

before.

around finally.

around. after

after.

afterreturning.

# /test/lock/error

around. befor

before.

around finally.

around. after

after.

aftererror.

spring AOP 多個切面

切面 日誌 author w7 public class logger 切面 安全框架 author w7 public class security 切面 許可權 author w7 public class privilege public void setaccess string acces...

spring aop 切面測試

spring 配置 aop 切面類 package com.changhang.urgoo.impl.utils import com.changhang.urgoo.impl.entity.result.mesresult import com.changhang.urgoo.impl.entit...

Spring aop 切面程式設計

package cn.annals.demo.proc.aop import org.aspectj.lang.joinpoint import org.aspectj.lang.proceedingjoinpoint import org.aspectj.lang.annotation.after...