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...