課程Spring註解驅動學習筆記(八)AOP

2021-10-02 16:28:05 字數 2744 閱讀 5236

指在程式執行期間動態的將某段**切入到指定方法指定位置進行執行的程式設計方式;

1、匯入aop模組;spring aop:(spring-aspects)

2、定義乙個業務邏輯類(mathcalculator);在業務邏輯執行的時候將日誌進行列印(方法之前、方法執行結束、方法出現異常,***)

3、定義乙個日誌切面類(logaspects):切面類裡面的方法需要動態感知mathcalculator.div執行到**然後執行;

通知方法:

前置通知(@before):logstart:在目標方法(div)執行之前執行

後置通知(@after):logend:在目標方法(div)執行結束之後執行(無論方法正常結束還是異常結束)

返回通知(@afterreturning):logreturn:在目標方法(div)正常返回之後執行

異常通知(@afterthrowing):logexception:在目標方法(div)出現異常以後執行

環繞通知(@around):動態**,手動推進目標方法執行(joinpoint.procced())

4、給切面類的目標方法標註何時何地執行(通知註解);

5、將切面類和業務邏輯類(目標方法所在類)都加入到容器中;

6、必須告訴spring哪個類是切面類(給切面類上加乙個註解:@aspect)

[7]、給配置類中加 @enableaspectjautoproxy 【開啟基於註解的aop模式】

在spring中很多的 @enable***

新增業務邏輯類

public class mathcalculator 

}

新增切面類

@aspect

public class logaspects ;

//@before在目標方法之前切入;切入點表示式(指定在哪個方法切入)

@before("pointcut()")

public void logstart(joinpoint joinpoint)"); }

@after("com.atguigu.aop.logaspects.pointcut()")

public void logend(joinpoint joinpoint)

//joinpoint一定要出現在參數列的第一位

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

public void logreturn(joinpoint joinpoint,object result)"); }

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

public void logexception(joinpoint joinpoint,exception exception)");

}}

新增配置類

@enableaspectjautoproxy

@configuration

public class mainconfigofaop

//切面類加入到容器中

@bean

public logaspects logaspects()

}

測試類

@test

public void test01()

執行結果

實現aop需要三步

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

2)在切面類上的每乙個通知方法上標註通知註解,告訴spring何時何地執行(切入點表示式)

3)開啟基於註解的aop模式;@enableaspectjautoproxy

1)@enableaspectjautoproxy 開啟aop功能

2)@enableaspectjautoproxy 會給容器中註冊乙個元件 annotationawareaspectjautoproxycreator

3)annotationawareaspectjautoproxycreator是乙個後置處理器;

4)容器的建立流程:

1)registerbeanpostprocessors()註冊後置處理器;建立annotationawareaspectjautoproxycreator物件

2)finishbeanfactoryinitialization()初始化剩下的單例項bean

1)建立業務邏輯元件和切面元件

2)annotationawareaspectjautoproxycreator攔截元件的建立過程

3)元件建立完之後,判斷元件是否需要增強

是:切面的通知方法,包裝成增強器(advisor);給業務邏輯元件建立乙個**物件(cglib);

5)執行目標方法:

1)**物件執行目標方法

2)cglibaopproxy.intercept()攔截;

1)得到目標方法的***鏈(增強器包裝成***methodinterceptor)

2)利用***的鏈式機制,依次進入每乙個***進行執行;

3)執行效果:

正常執行:前置通知-》目標方法-》後置通知-》返回通知

出現異常:前置通知-》目標方法-》後置通知-》異常通知

spring 註解驅動 01

註解有 controller 標註是乙個控制層 service 標註是乙個業務層 repository 標註是乙個持久層 configuration 表示是乙個配置類 componentscan 表示掃瞄包與spring bean.xml檔案中的掃瞄包效果一致 下面看是示例 一 這是乙個配置類 pa...

spring註解驅動 Autowired

1.autowired 自動注入 1.預設優先按照型別去容器中找對應的元件,如果找到多個,則按照屬性名作為元件 的 id 去容器中查詢 2.qualifier 使用 qualifier指定需要裝配的元件id,而不是屬性名 自動裝配預設一定要將屬性賦值好,沒有就報錯。可以使用 autowired re...

spring註解驅動(二)

import 給容器中註冊元件的方式 包掃瞄 註解標註註解 controller service repository component 侷限於自己寫的類 bean 匯入第三方包裡面的元件 import 快速給容器匯入乙個元件 import 要匯入到容器的元件 容器中就會自動註冊這個元件,id預設...