Spring AOP 注解方式實(shí)現(xiàn)的一些“坑”

使用過Spring AOP的注解方式實(shí)現(xiàn)歇式,也入過不少坑每强,現(xiàn)在做一下記錄逻住,希望有同樣需求的朋友可以少走彎路

使用之前還是先過一下官方文檔吧创葡,至少可以少走彎路,不用擔(dān)心英文讀不懂唠叛,其實(shí)只看代碼例子就能理解很多問題只嚣!

1. SpringBoot如何獲得Aspect支持?

看這里:Spring Boot 開啟AOP的方法

2. 我按照上面的方法開啟了AOP支持艺沼,為什么始終是不走切入點(diǎn)方法呢册舞?

首先仔細(xì)檢查一下,Aspect類是不是少了@Component注解(這一點(diǎn)很重要障般!)调鲸,只有一個(gè)@Aspect注解是不行的。如果還是不行挽荡,請(qǐng)繼續(xù)往下看藐石。

3. 攔截指定注解的規(guī)則怎么寫?如攔截所有帶了RequestMapping的方法

首先聲明一個(gè)寫入點(diǎn)來匹配所有要攔截的方法名
假如攔截所有方法

@Pointcut("execution(public * *(..))")
private void aspectMethod(){}

然后配置通知方法

@Before(value = "aspectMethod() && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public String doSomething() {
}

4. 攔截指定參數(shù)名的規(guī)則該怎么寫定拟?如攔截所有方法參數(shù)中有int page的方法

參數(shù)攔截可以用args@args于微,但是匹配的時(shí)候跟順序和數(shù)量有關(guān)

  • 如果只有page一個(gè)參數(shù)
@Before(value = "aspectMethod()  &&  args(page)")
public String doSomething(int page) {
}
  • 如果page為第一個(gè)參數(shù)
@Before(value = "aspectMethod()  &&  args(page, ..)")
public String doSomething(int page) {
}
  • 如果page為第二個(gè)參數(shù)
@Before(value = "aspectMethod()  &&  args(*, page, ..)")
public String doSomething(int page) {
}

說明:

  1. 參數(shù)的配置可以用占位符*..青自。
    *的意思是任意類型任意名稱的一個(gè)參數(shù)
    ..的意思是任意類型角雷,任意多個(gè)參數(shù),并且只能放到args的后面性穿。
  2. 通知方法的參數(shù)需要跟args中的固定參數(shù)page一致!
  3. 如果要獲取攔截方法的所有參數(shù),可以用JoinPointProceedingJoinPoint雷滚,兩者的區(qū)別:
    JoinPoint是父類需曾,提供獲取攔截方法的信息的功能,如所有參數(shù):jp.getArgs()
    ProceedingJoinPoint是子類祈远,只能用在@Around中呆万,除了提供JoinPoint的所有功能外,還能提供方法的運(yùn)行pjp.proceed()pjp.proceed(args)功能车份。

那下面問題來了谋减?我想匹配page參數(shù),但是page參數(shù)的位置不定怎么辦扫沼?
spring aop并不存在一個(gè)或多個(gè)的匹配出爹,所以如果可能庄吼,盡量將配置作為第一個(gè)參數(shù),這樣寫起來方便严就,如果真的需要匹配不確定的位置总寻,那就多寫幾個(gè)匹配規(guī)則吧!

  • 第一個(gè)參數(shù): args(page, ..)
  • 第二個(gè)參數(shù): args(*, page, ..)
  • 第三個(gè)參數(shù): args(*, *, page, ..)
  • 以此類推

如果這樣還沒有滿足所有需求梢为,那么只能問問自己渐行,編碼的時(shí)候知道不知道什么叫約定大于配置了。

5. 如果即有攔截參數(shù)铸董,又需要注入JoinPointProceedingJoinPoint怎么辦祟印?

JoinPointProceedingJoinPoint作為第一個(gè)參數(shù),剩下的自定義的參數(shù)放到后面粟害,如:

@Before(value = "aspectMethod()  &&  args(page)")
public String doSomething(JoinPoint jp, int page) {
}

6. 有沒有配置攔截規(guī)則示例蕴忆?

有的,請(qǐng)查看原文:aop pointcuts examples我磁。

這里注意孽文,*用在返回值和方法參數(shù)上并不是一個(gè)或多個(gè),而是指任意一個(gè)夺艰,如用在返回值上芋哭,表示任意類型的返回值;用在方法的參數(shù)上郁副,指任意類型的一個(gè)參數(shù)减牺。官方也給出了解釋,在這里可能會(huì)有很多坑存谎,大家可以注意一下拔疚!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市既荚,隨后出現(xiàn)的幾起案子稚失,更是在濱河造成了極大的恐慌,老刑警劉巖恰聘,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件句各,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晴叨,警方通過查閱死者的電腦和手機(jī)凿宾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼蕊,“玉大人初厚,你說我怎么就攤上這事∷锛迹” “怎么了产禾?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵排作,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我下愈,道長(zhǎng)纽绍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任势似,我火速辦了婚禮拌夏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘履因。我一直安慰自己障簿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布栅迄。 她就那樣靜靜地躺著站故,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毅舆。 梳的紋絲不亂的頭發(fā)上西篓,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音憋活,去河邊找鬼岂津。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悦即,可吹牛的內(nèi)容都是我干的吮成。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼辜梳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粱甫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起作瞄,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤茶宵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宗挥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节预,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年属韧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤吓。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宵喂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出会傲,到底是詐尸還是另有隱情锅棕,我是刑警寧澤拙泽,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站裸燎,受9級(jí)特大地震影響顾瞻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜德绿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一荷荤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧移稳,春花似錦蕴纳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至都许,卻和暖如春稻薇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胶征。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工塞椎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弧烤。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓忱屑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親暇昂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莺戒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)急波,斷路器从铲,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 基本知識(shí) 其實(shí), 接觸了這么久的 AOP, 我感覺, AOP 給人難以理解的一個(gè)關(guān)鍵點(diǎn)是它的概念比較多, 而且坑爹...
    永順閱讀 8,139評(píng)論 5 114
  • AOP實(shí)現(xiàn)可分為兩類(按AOP框架修改源代碼的時(shí)機(jī)): 靜態(tài)AOP實(shí)現(xiàn):AOP框架在編譯階段對(duì)程序進(jìn)行修改名段,即實(shí)現(xiàn)...
    數(shù)獨(dú)題閱讀 2,310評(píng)論 0 22
  • 轉(zhuǎn)自:http://www.cnblogs.com/shipengzhi/articles/2716004.htm...
    王帥199207閱讀 1,259評(píng)論 0 6
  • 實(shí)現(xiàn)了序列化和比較器 這個(gè)屬性是用來存儲(chǔ)string中的內(nèi)容的 緩存hashcode 比較每一位上面的字符是否相同...
    goldgreat閱讀 242評(píng)論 0 0