Spring Aop 內部方法呼叫攔截問題

2021-10-01 19:21:34 字數 2457 閱讀 4225

問題產生原因

問題解決方法

首先定義日誌記錄註解

@target

(elementtype.method)

@retention

(retentionpolicy.runtime)

public @inte***ce

logannotation

定義增強類advisor,其實就類似於乙個切面,由切點(poincut)與通知(advice)組成。

public

class

logannotationadvisor

extends

abstractpointcutadvisor

public

void

setadvice

(advice advice)

@override

public pointcut getpointcut()

@override

public advice getadvice()

}

定義方法***,methodinterceptor拓展了advice,所以該***就類似於乙個aop中的通知,可以在方法呼叫前後處理一些業務邏輯。

配置增強類例項,裝填切點與通知。切點使用註解方法形式。

@configuration

public

class

logannotationinterceptorconfig

}

接下來就是業務**

controller類

@restcontroller

("/test"

)public

class

basecontroller

}

service 類

@service

public

class

baseservice

@logannotation

(value =

"baseservice hello"

)public string hello()

}

這樣我們在需要列印呼叫日誌的方法上個加上@logannotation便可進行日誌記錄,方便排查問題,鏈路追蹤。

接下來啟動工程,呼叫test方法時會進入我們定義的方法***中,列印對應日誌,而在baseservice的add方法中呼叫hello方法時卻沒有被***攔截。

basecontroller呼叫baseservice的add方法時會被org.springframework.aop.framework.cglibaopproxy.dynamicadvisedinterceptor#intercept***攔截,然後呼叫cglib**類的**方法org.springframework.aop.framework.reflectivemethodinvocation#proceed。在該方法執行過程中會獲取自定義的***logannotationinterceptor,然後執行我們植入的業務邏輯。但是在baseservice的add方法中呼叫hello方法時是直接通過this來呼叫的,並不會呼叫到對應的**物件。所以不會列印對應的hello方法呼叫時的日誌。類似spring的事物其實也存在這樣的問題。大致原因如下圖

通過注入本類來進行方法呼叫

獲取**類而不使用this來呼叫。在baseservice中注入本類,在執行時我們可以發現注入的是**類,所以在add中呼叫hello時會在此執行切面邏輯。

上述方式是在執行時獲取**類,對於**有很大的侵入性,不知道有沒有更好的辦法 0.0

Spring AOP類內部呼叫失效問題

問題描述 people service類中有方法a 和b 在a中呼叫b,那麼aop只能攔截到a,卻攔截不到b 解決方案 1 基於 proxy 的 spring aop 帶來的內部呼叫問題可以使用 aopcontext.currentproxy 強轉為當前的再呼叫就可以解決了 錯誤用法 public ...

spring aop 之鏈式呼叫

關關雎鳩,在河之洲。窈窕淑女,君子好逑。aop aspect orient programming 我們一般稱為面向方面 切面 程式設計,作為物件導向的一種補充,用於處理系統中分布於各個模組的橫切關注點,比如事務管理 日誌 快取等等。springaop採用的是動態 在執行期間對業務方法進行增強,所以...

spring aop 之鏈式呼叫

關關雎鳩,在河之洲。窈窕淑女,君子好逑。aop aspect orient programming 我們一般稱為面向方面 切面 程式設計,作為物件導向的一種補充,用於處理系統中分布於各個模組的橫切關注點,比如事務管理 日誌 快取等等。springaop採用的是動態 在執行期間對業務方法進行增強,所以...