時光如梭,轉眼之間,春招已然結束,秋招正在趕來,又到了技術布道的時候了。。
今天簡單的聊一聊aop(aspect oriented programming)
起因
專案中需要檢視一些方法前後的執行時間,以便合理的推測出**是否能夠扛得住xxqps的訪問。要是每個方法前後都寫乙個時間減法,那可真是個累活了,於是aop思想出來了。。通過乙個條件來匹配想要攔截的**,這個條件在aop中就是pointcut(切點)
切點搞定之後,只需要再做乙個切面(即定義攔截後的操作)就行了。
假設現在有乙個需求:
inte***ce passing
在這個介面前面和後面都列印出特定的字串
方法一:寫死**
inte***ce
passing
class
passingimpl
implements
passing
private
void before()
private
void after()
}public
class
hello
}
如果只有乙個方法那還好說,但是萬一每個方法都要有這個需求,那工作量可就完蛋了,所以aop來了。
一般可以有以下三種解決方案:
* 靜態**
* jdk動態**
* cglib動態**
靜態**
inte***ce
passing
class
passingimpl
implements
passing
private
void before()
private
void after()
}class
passingproxy
implements
passing
@override
public
void time_consume(string name)
private
void before()
private
void after()
}public
class
hello
}
靜態**看起來還是不錯的,但是如果我想多**幾個其他的,那還得為其他的幾個量身定做幾個,這重複勞動要不得,所以就有了接下來的jdk動態**。
jdk動態**
class jdkdynamicproxy implements invocationhandler
public
t getproxy()
@override
public object invoke(object proxy, method method, object args) throws throwable
private
void
before()
private
void
after()
}public
class hello
}
如此這般,所有的**類都能夠合併到動態**類中,還是得感謝泛型,但是這樣做有乙個問題:jdk的動態**只能夠提供有**介面的,不能**沒有介面的類,這下麻煩大了,萬一專案中就是需要**沒有介面的類該咋辦呢。cglib動態**!
cglib動態**
使用開源的cglib類庫可以**沒有介面的類,這樣就完美解決了上述問題,該**以後有時間再詳細研究研究spring aop:
aop框架可以理解為乙個***框架,只需要攔截特定的方法即可,這個時候切面(aop的實現方式)就是aop的核心,即給出如何攔截的方式,說白了就是通過切面,將攔截匹配的條件組合在一起,然後 將這個切面配置到proxyfactory中,從而生成**。
最後附上一張aop思維導圖
小結
感謝本書《架構探險》,aop確實值得好好的研究研究。
簡單理解AOP(面向切面程式設計)
aop為aspect oriented programming的縮寫,意為 面向切面程式設計,通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop與oop是面向不同領域的兩種設計思想。oop 物件導向程式設計 針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯...
簡單理解AOP(面向切面程式設計)
aop為aspect oriented programming的縮寫,意為 面向切面程式設計,通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop與oop是面向不同領域的兩種設計思想。oop 物件導向程式設計 針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯...
簡單理解AOP(面向切面程式設計)
aop為aspect oriented programming的縮寫,意為 面向切面程式設計,通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop與oop是面向不同領域的兩種設計思想。oop 物件導向程式設計 針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯...