spring aop

Spring AOP注解案例及基本原理詳解

這篇文章主要介紹了Spring AOP注解案例及基本原理詳解,文中通過示例代碼介紹的非常詳細(xì)溃卡,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

java

切面:Aspect

切面=切入點+通知。在老的spring版本中通常用xml配置蜒简,現(xiàn)在通常是一個類帶上@Aspect注解瘸羡。切面負(fù)責(zé)將 橫切邏輯(通知) 編織 到指定的連接點中。

目標(biāo)對象:Target

將要被增強的對象搓茬。

連接點:JoinPoint

可以被攔截到的程序執(zhí)行點,在spring中就是類中的方法。

切入點:PointCut

需要執(zhí)行攔截的方法张漂,也就是具體實施了橫切邏輯的方法倒源。切入點的規(guī)則在spring中通過AspectJ pointcut expression language來描述。

切入點與連接點的區(qū)別:連接點是所有可以被"切"的點;切入點是真正要切的點。

通知:Advice

針對切入點的橫切邏輯,包含“around”垢啼、“before”和“after”等不同類型的通知。

通知的作用點如其命名:

before:在切入點之前執(zhí)行

after:在切入點之后執(zhí)行

around:在切入點攔截方法张肾,自定義前后芭析,更靈活

還有一些異常處理的通知,這里不一一舉例

織入:Weaving

將切面和目標(biāo)對象連接起來吞瞪,創(chuàng)建代理對象的過程馁启。spring中用的是動態(tài)代理。假如目標(biāo)對象有接口尸饺,使用jdk動態(tài)代理进统;否則使用cglib動態(tài)代理。

說了這么多概念浪听,看看代碼實現(xiàn)可能會使讀者理解的更深刻一些螟碎,這里簡單寫一個通過注解增強方法的AOP-Demo。

首先是切面類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

package com.example.demo.aop;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;

/**

* @author Fcb

* @date 2020/6/20

* @description 切面類=切入點+通知

*/

@Aspect

@Component

public class LogAspect {

? //這個方法定義了切入點

? @Pointcut("@annotation(com.example.demo.aop.anno.MyLog)")

? public void pointCut() {}

? //這個方法定義了具體的通知

? @After("pointCut()")

? public void recordRequestParam(JoinPoint joinPoint) {

? ? for (Object s : joinPoint.getArgs()) {

? ? ? //打印所有參數(shù)迹栓,實際中就是記錄日志了

? ? ? System.out.println("after advice : " + s);

? ? }

? }

? //這個方法定義了具體的通知

? @Before("pointCut()")

? public void startRecord(JoinPoint joinPoint) {

? ? for (Object s : joinPoint.getArgs()) {

? ? ? //打印所有參數(shù)

? ? ? System.out.println("before advice : " + s);

? ? }

? }

? //這個方法定義了具體的通知

? @Around("pointCut()")

? public Object aroundRecord(ProceedingJoinPoint pjp) throws Throwable {

? ? for (Object s : pjp.getArgs()) {

? ? ? //打印所有參數(shù)

? ? ? System.out.println("around advice : " + s);

? ? }

? ? return pjp.proceed();

? }

}

注解:

1

2

3

4

5

6

7

8

9

10

11

12

package com.example.demo.aop.anno;

import java.lang.annotation.*;

/**

* @author Fcb

* @date 2020/6/20

* @description

*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD, ElementType.TYPE})

public @interface MyLog {

}

目標(biāo)類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

package com.example.demo.aop.target;

import com.example.demo.aop.anno.MyLog;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

/**

* @author Fcb

* @date 2020/6/20

* @description

*/

@RestController

public class MockController {

? @RequestMapping("/hello")

? @MyLog

? public String helloAop(@RequestParam String key) {

? ? System.out.println("do something...");

? ? return "hello world";

? }

}

最后是測試類:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.example.demo.aop.target;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

/**

* @author Fcb

* @date 2020/6/20

* @description

*/

@SpringBootTest

class MockControllerTest {

? @Autowired

? MockController mockController;

? @Test

? void helloAop() {

? ? mockController.helloAop("aop");

? }

}

控制臺結(jié)果:

around advice : aop

before advice : aop

do something...

after advice : aop

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掉分,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子克伊,更是在濱河造成了極大的恐慌酥郭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愿吹,死亡現(xiàn)場離奇詭異不从,居然都是意外死亡,警方通過查閱死者的電腦和手機犁跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門椿息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坷衍,你說我怎么就攤上這事寝优。” “怎么了枫耳?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵乏矾,是天一觀的道長。 經(jīng)常有香客問我,道長钻心,這世上最難降的妖魔是什么凄硼? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扔役,結(jié)果婚禮上帆喇,老公的妹妹穿的比我還像新娘。我一直安慰自己亿胸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布预皇。 她就那樣靜靜地躺著侈玄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吟温。 梳的紋絲不亂的頭發(fā)上序仙,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音鲁豪,去河邊找鬼潘悼。 笑死,一個胖子當(dāng)著我的面吹牛爬橡,可吹牛的內(nèi)容都是我干的治唤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糙申,長吁一口氣:“原來是場噩夢啊……” “哼宾添!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柜裸,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤缕陕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疙挺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扛邑,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年铐然,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔬崩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锦爵,死狀恐怖舱殿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情险掀,我是刑警寧澤沪袭,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響冈绊,放射性物質(zhì)發(fā)生泄漏侠鳄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一死宣、第九天 我趴在偏房一處隱蔽的房頂上張望伟恶。 院中可真熱鬧,春花似錦毅该、人聲如沸博秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挡育。三九已至,卻和暖如春朴爬,著一層夾襖步出監(jiān)牢的瞬間即寒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工召噩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留母赵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓具滴,卻偏偏與公主長得像凹嘲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抵蚊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 目錄 1. Web MVC發(fā)展史歷程2.Spring概要3.Spring-依賴注入概要(IOC)4.屬性注入的三種...
    唯老閱讀 1,445評論 0 3
  • 一施绎、概要 Spring加入了對AOP編程支持,利用AOP的思想結(jié)合Spring的一些API可以實現(xiàn)核心業(yè)務(wù)與輔助業(yè)...
    任未然閱讀 239評論 0 1
  • 六、基于@Aspect注解編程(重點) 1冈闭、說明 Spring 使用了和AspectJ 一樣的注解并使用Aspec...
    唯老閱讀 565評論 0 1
  • Spring AOP 模塊俱尼,是 Spring 框架體系結(jié)構(gòu)中十分重要的內(nèi)容,該模塊中提供了面向切面編程實現(xiàn) 萎攒。本章...
    遼A丶孫悟空閱讀 1,135評論 2 14
  • 目錄 1. Web MVC發(fā)展史歷程2.Spring概要3.Spring-依賴注入概要(IOC)4.屬性注入的三種...
    唯老閱讀 1,289評論 0 3