spring原始碼,AOP的使用

2021-09-26 04:36:50 字數 2514 閱讀 5737

1.aop是什麼

網路上很多解釋,本文不在贅述,大致意思就好比,比如你乙個月前開發了乙個**,功能就是乙個除法功能,而現在,你想在原有除法功能基礎上,記錄傳入的引數(除數,被除數)到資料庫,並且在除法功能完成後,記錄一下返回值到資料庫。按照以前的邏輯是需要到這個除法功能裡面,修改原有**。當然,這個除法功能相對比較簡單,修改原有**不複雜,但是實際生產上的業務肯定是比這個複雜的多,改**的風險也是不可預計的。在設計模式有一種原則就是開閉原則,對修改關閉,對擴充套件開放,也是為了規避這一風險,所以spring的aop很好的做到了這一點。

2.如何使用aop

引入spring和springaop還有junit的相關jar包

4.0.0

springdemo

springdemo

0.0.1-snapshot

org.springframework

spring-context

5.0.4.release

junit

junit

4.12

test

org.springframework

spring-aspects

5.0.4.release

定義配置類

@configuration

@enableaspectjautoproxy

@componentscan("com.erwan.cap12.bean")

public class cap12mainconfigaop

@bean

public calculatoraop calculatoraop()

}

其中enableaspectjautoproxy註解就是開啟aop功能

//原有**,提供除法功能的類

public class calculator 

}

定義乙個切面類,來擴充套件calculator

@aspect

public class calculatoraop

@before("pointcut()")

public void logbefore(final joinpoint joinpoint)

@after("pointcut()")

public void logend(final joinpoint joinpoint)

@afterthrowing(value = "pointcut()", throwing = "ex")

public void logexception(final exception ex)

@afterreturning(value = "pointcut()", returning = "result")

public void logreturn(final object result)

@pointcut("execution(public * com.erwan.cap12.bean.calculator.*(..))")

public void pointcut()

}

測試類:

@test

public void cap12()

測試結果如下:

@around:執行目標方法之前...

div開始前[4, 2]

calculator自己執行的div

@arountd:執行目標方法之後...

div開始後[4, 2]

div返回值2

所以使用aop就以下三步

1,將業務邏輯元件和切面類都加入到容器中, 告訴spring哪個是切面類(@aspect)

2,在切面類上的每個通知方法上標註通知註解, 告訴spring何時執行(寫好切入點表示式,參照官方文件)

3,開啟基於註解的aop模式  @eable***x

springaop可以應用5種型別的通知:

1.前置通知(before):在目標方法被呼叫之前呼叫通知功能。

2.後置通知(after):在目標方法完成之後呼叫通知,此時不會關心方法的輸出是什麼。

3.返回通知(after-returning):在目標方法成功執行之後呼叫通知。

4.異常通知(after-throwing):在目標方法丟擲異常後呼叫通知。

5.環繞通知(around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。

其中環繞通知比較特殊,他可以在註解的方法體(aroundcalculator)定義是否執行目標方法,如果不執行,則after 和after-returning則不生效,他也可以在捕捉到異常後,重新執行目標方法(div),功能比較強大

其中@pointcut就是定義需要攔截或者說增強的目標類和目標類的方法,其中 calculator.*(..)代表 calculator類的所有方法就是增強所有方法的呼叫。

使用joinpoint可以拿到相關的內容, 比如方法名,  引數

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Spring原始碼學習(二) AOP

aop有些特有的概念,如 advisor advice和pointcut等等,使用或配置起來有點繞,讓人感覺有些距離感,其實它的實現就是一組標準的設計模式的組合使用 factory proxy chain of responsibility,只要搞清楚這幾個設計模式,讀aop的原始碼是比較容易的。首...

spring中aop原始碼理解 一

spring中aop涉及的類我們衝 annotationawareaspectjautoproxycreator我們看下它的繼承結構 由於它實現了beanpostprocessor介面所有在獲取bean時可以進行一定的處理,aop正是利用這個特性來做的,public object postproce...