AOP ,面向切面編程,在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。其實就是在代碼運行,進行一定的包裝,如在方法執行前、方法返回后、方法拋出異常后等地方進行一定的攔截處理或者叫增強處理
先講一下AspectJ和Spring AOP關系,網上很多文章對AspectJ存在錯誤說法
AspectJ:
AspectJ 來自于 Eclipse 基金會,是Eclipse托管給Apache基金會的一個開源項目
屬于靜態織入,它是通過修改代碼來實現的,它的織入時機可以是:
Compile-time weaving:編譯期織入
Post-compile weaving:也就是已經生成了 .class 文件,就要用到編譯后織入
Load-time weaving:指的是在加載類的時候進行織入
AspectJ框架非常強大,它是 AOP 編程的完全解決方案。Spring AOP 致力于解決的是企業級開發中最普遍的 AOP 需求(方法織入)
AspectJ 在實際代碼運行前完成了織入,所以大家會說它生成的類是沒有額外運行時開銷的
SpringAOP:
基于動態代理來實現。默認地,如果使用接口的,用 JDK 提供的動態代理實現,如果沒有接口,使用 CGLIB 實現
Spring AOP 和AspectJ并沒有什么太多的關系,僅僅是Spring 延用了 AspectJ 中的概念,包括使用了 AspectJ 提供的 jar 包中的注解,但是不依賴于其實現功能
Spring AOP 需要依賴于 IOC 容器來管理,只能作用于 Spring 容器中的 Bean,它是使用純粹的 Java 代碼實現的,只能作用于 bean 的方法
Spring AOP 比 AspectJ 的性能稍差
Joinpoint(連接點)
所謂連接點是指能夠被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點(任何一個方法都可以稱為連接點)
Pointcut(切入點)
切入點是指我們要對哪些Joinpoint進行攔截的定義(對哪個方法進行增強)
Advice(通知/增強)
通知是指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)(要給它增加什么功能)
Target(目標對象)
代理的目標對象
Weaving(織入)
是指把增強應用到目標對象來創建新的代理對象的過程(怎樣得到代理對象)
Proxy(代理)
一個類被AOP織入增強后,就產生一個結果代理類
Aspect(切面)
是切入點和通知的結合,構成切面,我們可以使用注解或者xml進行配置
1. 在 xml 中配置
開啟 @AspectJ 的注解,還有其它方式,這里不介紹
<aop:aspectj-autoproxy/>
2. 使用@Aspect注解
定義實現AOP的配置類
@Aspect 注解要作用在 bean 上面
@Component@AspectpublicclassLogAspect{}
3. 配置 Pointcut
用于定義哪些方法需要被增強或者說需要被攔截
@Pointcut(""execution(*com.ljj.service(..))"")privatevoidcontrollerAspect(){//TODOAuto-generatedmethodstub}@Pointcut("@annotation(com.ljj.annotation.Log)")privatevoidcontrollerAspect1(){//TODOAuto-generatedmethodstub}@Pointcut(""within(com.ljj.service..*)"")privatevoidcontrollerAspect2(){//TODOAuto-generatedmethodstub}@Pointcut("bean(*Service)")privatevoidcontrollerAspect3(){//TODOAuto-generatedmethodstub}
execution ,正則匹配方法簽名
@annotation。匹配對應注解的方法
within,指定所在類或所在包下面的方法
bean(idOrNameOfBean), 匹配 bean 的名字
4. 配置 Advice
@AspectpublicclassAdviceExample{//下面方法就是寫攔截"dao層實現"@Before("com.ljj.aop.dataAccessOperation()")publicvoiddoAccessCheck(){//...實現代碼}@Before("execution(*com.ljj.dao.*.*(..))")publicvoiddoAccessCheck(){//...實現代碼}@AfterReturning("com.ljj.aop.dataAccessOperation()")publicvoiddoAccessCheck(){//...}@AfterReturning(pointcut="com.ljj.aop.dataAccessOperation()",returning="retVal")publicvoiddoAccessCheck(ObjectretVal){//這樣,進來這個方法的處理時候,retVal就是相應方法的返回值,是不是非常方便//...實現代碼}//異常返回@AfterThrowing("com.ljj.aop.dataAccessOperation()")publicvoiddoRecoveryActions(){//...實現代碼}@AfterThrowing(pointcut="com.ljj.aop.dataAccessOperation()",throwing="ex")publicvoiddoRecoveryActions(DataAccessExceptionex){//...實現代碼}//注意理解它和@AfterReturning之間的區別,這里會攔截正常返回和異常的情況@After("com.ljj.aop.dataAccessOperation()")publicvoiddoReleaseLock(){//通常就像finally塊一樣使用,用來釋放資源。//無論正常返回還是異常退出,都會被攔截到}//既能做@Before的事情,也可以做@AfterReturning的事情@Around("com.ljj.businessService()")publicObjectdoBasicProfiling(ProceedingJoinPointpjp)throwsThrowable{//startstopwatchObjectretVal=pjp.proceed();//stopstopwatchreturnretVal;}}
上面Advice都已經匹配了對應的PointCut,這樣定義可以不用再定義PointCut了。也可以使用下面這種PointCut + Advice
//定義日志注解@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceLog{//操作名StringoptName();//操作類型OperateTypeoptType();//操作表名StringoptTable();//操作編碼StringoptCode();}@Pointcut("@annotation(com.ljj.annotation.Log)")privatevoidcontrollerAspect(){//TODOAuto-generatedmethodstub}//日志切面@Around("controllerAspect()")publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{try{//方法執行前操作result=point.proceed();//方法執行后操作}catch(Exceptione){e.printStackTrace();}}
到此,關于“SpringAOP的介紹和使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(資料圖片)最近這段時間總有小伙伴問小編李易峰主演的電視劇有哪些電視劇是什么,小編為此在網上搜尋了一些有關于李易峰主演的電視劇有哪些電視劇的知識送給大家,希望能解答各位小伙伴的疑惑。李易峰,1987年5月4日出生于四川成都,中國內地男演員、流行樂歌手、影視制片人,畢業于四川師范大學電影電視學院。2007年,參加東方衛視選秀娛樂節目《加油!好男兒》的比賽,獲得全國總決賽第八名,從而正式出道。李易峰主...
什么是股票四線開花?四線開花是發現牛股的利器,具有很強的實際作用,了解的話是找到中長期股票是很好的方法之一。在移動平均線中,有一種模式叫做四線開花。既然是四線,那肯定是四個均線,可以是四線在日水平開花,也可以是四線在周水平開花。長期通常指60日移動平均線、120日移動平均線、180日移動平均線和250日移動平均線四種長期移動平均線。所以四線開花代表著一個大市場的發展。實際上開花的實現意味著四個均線...
(資料圖片)2022年8月LPR利率報價公布。據數據顯示,新一期貸款市場報價利率(LPR):1年期LPR為3.65%,5年期以上LPR為4.3%,分別較上月下調5個基點和15個基點,這也是5年期以上LPR今年第三次下調。據媒體稱,LPR下降后,多個地區的銀行分支行及網點首套房貸款利率隨5年期以上LPR進行下調。目前,北上廣深四大一線城市首套房貸款利率均降至5%以下,蘇州、呼和浩特等地首套房貸款利率...