基於註解實現

2021-10-03 04:28:56 字數 3301 閱讀 5067

/**

* 用於記錄日誌的工具類,它裡面提供了公共的**

*/@component

("logger"

)@aspect

//表示當前類是乙個切面類

public

class

logger

/** * 前置通知

*/// @before("pt1()")

public

void

beforeprintlog()

/** * 後置通知

*/// @afterreturning("pt1()")

public

void

afterreturningprintlog()

/** * 異常通知

*/// @afterthrowing("pt1()")

public

void

afterthrowingprintlog()

/** * 最終通知

*/// @after("pt1()")

public

void

afterprintlog()

/** * 環繞通知

* 問題:

* 當我們配置了環繞通知之後,切入點方法沒有執行,而通知方法執行了。

* 分析:

* 通過對比動態**中的環繞通知**,發現動態**的環繞通知有明確的切入點方法呼叫,而我們的**中沒有。

* 解決:

* spring框架為我們提供了乙個介面:proceedingjoinpoint。該介面有乙個方法proceed(),此方法就相當於明確呼叫切入點方法。

* 該介面可以作為環繞通知的方法引數,在程式執行時,spring框架會為我們提供該介面的實現類供我們使用。

** spring中的環繞通知:

* 它是spring框架為我們提供的一種可以在**中手動控制增強方法何時執行的方式。

!-- 配置srping的ioc,把service物件配置進來--

>

"accountservice"

class

="cn.qut.service.impl.accountserviceimpl"

>

<

/bean>

<

!-- 配置logger類 --

>

"logger"

class

="cn.qut.utils.logger"

>

<

/bean>

<

!--配置aop--

>

<

!-- 配置切入點表示式 id屬性用於指定表示式的唯一標識。expression屬性用於指定表示式內容

此標籤寫在aop:aspect標籤內部只能當前切面使用。

它還可以寫在aop:aspect外面,此時就變成了所有切面可用

-->

"pt1" expression=

"execution(* cn.qut.service.impl.*.*(..))"

>

<

/aop:pointcut>

<

!--配置切面 --

>

"logadvice" ref=

"logger"

>

<

!-- 配置前置通知:在切入點方法執行之前執行

"beforeprintlog" pointcut-ref=

"pt1"

>

<

/aop:before>

-->

<

!-- 配置後置通知:在切入點方法正常執行之後值。它和異常通知永遠只能執行乙個

"afterreturningprintlog" pointcut-ref=

"pt1"

>

<

/aop:after-returning>

-->

<

!-- 配置異常通知:在切入點方法執行產生異常之後執行。它和後置通知永遠只能執行乙個

"afterthrowingprintlog" pointcut-ref=

"pt1"

>

<

/aop:after-throwing>

-->

<

!-- 配置最終通知:無論切入點方法是否正常執行它都會在其後面執行

"afterprintlog" pointcut-ref=

"pt1"

>

<

/aop:after>

-->

<

!-- 配置環繞通知 詳細的注釋請看logger類中,有錯誤--

>

"aroundpringlog" pointcut-ref=

"pt1"

>

<

/aop:around>

<

/aop:aspect>

<

/aop:config>

<

/beans>

在使用註解實現後置通知和最終通知時,兩者的執行順序會出現問題,但後置通知和異常通知去沒有問題,建議使用環繞通知自己呼叫方法實現以上通知。

@configuration

@componentscan

(basepackages=

"cn.qut"

)@enableaspectjautoproxy

// 開啟動態**

public

class

springconfiguration

AOP基於註解實現

切面類 component 控制反轉 aspect 宣告切面類 public class forumadvisor after execution com.mitu.aspect.宣告後置增強 public void after around execution com.mitu.aspect.宣告...

基於註解SpringAOP實現

aop 動態 指在程式執行期間動態的將某段 切入到指定方法指定位置進行執行的程式設計方式 1 匯入aop模組 spring aop spring aspects org.springframework spring aspects 5.2.7.release 2 定義乙個業務邏輯類 mathcalc...

基於註解的日誌實現

隨著公司業務邏輯逐漸複雜,越來越多的專案採用了前後端分離進行開發,提高了開發效率,但是無形中增加了溝通和除錯成本。故開發人員在 中採用了列印前端或者終端傳遞過來引數資訊,這樣當出現問題時能夠排查和說明問題出在何處。aop log就是出於這樣一種使用場景而出現。總共兩種註解形式,一種是 註解加在con...