總所周知,spring通過動態**的方式實現aop處理,那麼當我們呼叫乙個被aop處理的方法,其內部是如何實現的呢?
我們以jdk動態**為例,當我們訪問**物件到最後訪問目標方法,jdkdynamicaopproxy採用了如下步驟:
jdk動態**使用getproxy方法獲取**物件,進入getproxy方法:
public object getproxy(classloader classloader)
class<?> proxiedinte***ces = aopproxyutils.completeproxiedinte***ces(this.advised);
this.finddefinedequalsandhashcodemethods(proxiedinte***ces);
return proxy.newproxyinstance(classloader, proxiedinte***ces, this);
}
呼叫**物件的invoke方法,進入invoke方法:
public object invoke(object proxy, method method, object args) throws throwable else
…………
}
匹配通知型別呼叫通知
public
list
getinterceptorsanddynamicinterceptionadvice(
advised config, method method, class
targetclass)
}else }}
}else
if (advisor instanceof introductionadvisor)
}else
}return interceptorlist;
}
這裡先獲取***鏈,跟蹤getinterceptorsanddynamicinterceptionadvice方法,其實此處使用了介面卡的設計模式,將配置的通知advisor轉化成***interceptor。
呼叫目標方法
public object proceed() throws throwable
object interceptororinterceptionadvice =
this.interceptorsanddynamicmethodmatchers.get(++this.currentinterceptorindex);
if (interceptororinterceptionadvice instanceof interceptoranddynamicmethodmatcher)
else
}else
}
可以看到,此處迴圈呼叫processd方法,如果currentinterceptorindex =-1,表示所有的***呼叫完畢,接下來呼叫目標方法。 深入理解springAOP
概念 aop aspect oriented programming 即面向切面程式設計。它是對傳統的oop 物件導向 程式設計的一種補充,在oop中往往乙個物件有什麼行為我們就定義什麼方法,物件與物件之間存在緊密聯絡。與oop不同的是aop更加關注的是切面,我們只需要關注於物件的核心業務而不是所有...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...