AOP編程全解析

 

AOP是一種編程思想,一套規範。java

軟件開發經歷了面向過程編程時代,以C語言爲表明,以後是面向對象編程時代,以Java語言爲表明。編程

在21世紀大牛們又提出了一種新的編程思想面向方面編程,即AOP理念,全稱Aspect-Oriented Programming。安全

AOP是第三代編程思想,到哪免不了都要問下。ide

發展歷史

1997年在面向對象編程大會上Gregor Kiczales等人首次提出了AOP的概念,以後各大公司等分別加入研究。2001年Palo Alto研究中心發佈了首個支持AOP的語言AspectJ,同時也是一個規範。模塊化

目標定位

在對真實世界抽象的面向對象編程過程當中,始終伴隨着某寫操做的代碼沒法實現模塊化封裝,會散落在各個對象中存在,特別是非功能性代碼。對於通常的功能開發採起面向對象方式進行抽象是可以很好應付的,可是面向方面(切面)給了一種新的思惟方式來考慮編程,能更好的進行全局結構化思考。工具

因此AOP主要解決兩個問題:學習

  • 代碼分散問題,特別是那些非功能性代碼。
  • 做爲面向對象編程思惟的一種補充和完善。

核心知識點

  • 鏈接點

鏈接點:join point,程序的一個執行點,如類中的一個方法,方法裏面一個代碼塊。測試

  • 切入點

切入點:point cut,是一個捕獲鏈接點的代碼結構,就是定義一個代碼邏輯用來捕獲某個鏈接點的代碼。代理

  • 方面

方面;aspect,是具體被執行的切面邏輯代碼,相似於一個類。調試

  • 通知

通知:advice,是point cut執行的代碼,定義在鏈接點什麼時機來執行aspect。

主要運用場景

場景分爲2類:

一類是非功能性需求,如日誌、異常、安全、事務均可以使用AOP思想編程。

另外一類是功能性需求,在原來對象抽象的思惟中添加AOP思惟,這裏是一種結構化思惟,在定義類時考慮多個類的切面共性。

主流AOP語言實現

對AOP實現除了AspectJ外,已知的還有JBoss AOP、Spring AOP等。

這裏只介紹AspectJ和SpringAOP,重點是他們不一樣點。

AspcetJ

AspectJ採用靜態織入方式進行切面織入原代碼,提供獨立的編譯器把切面和原代碼的java文件編織成一個新的class文件。提供了詳細的編譯日誌和調試工具,編譯時間長可是運行效率高。

鏈接點的支持範圍:

  • 方法和構造器調用
  • 方法和構造器執行
  • 屬性訪問
  • 異常處理
  • 類初始化,是static代碼塊
  • 語法結構
  • 控制流
  • 對象及參數類型
  • 條件測試

關聯鏈接點通知方式:

  • before,鏈接點執行前運行
  • after,鏈接點執行後運行
  • around,鏈接點的整個外側,整個包住,可以絕的鏈接點執行和修改上下文環境

Spring AOP

Spring AOP沒有徹底實現AspectJ語言,它更多的是對Spring framwork進行Aop能力的擴展實現,補全Spring framework的不足並讓Aop與Spring framwork融合。

鏈接點只支持方法攔截調用。

鏈接點通知方式在aspect的before、after、around的基礎上增長throw對異常的觸發的攔截。

Spring AOP與Spring IoC體系融合,對於aspect類統一交由Spring beans管理,而且提供ProxyFactoryBean的AOP代理工廠類,還有自動代理的BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator的強大工具。

Spring AOP是動態織入,在運行時完成AOP的aspect代碼織入原代碼邏輯中。其底層默認採用JDK的動態代理實現AOP代理,當對象沒有實現接口時,CGLIB會默認使用。

優缺點

優勢:解決代碼散亂問題、代碼邏輯解偶、易於維護、提供擴展性和可重用性。

缺點:切面越多系統越複雜難懂、工程師學習成本增長(業務再也不是線型,變成了跳躍式)

AOP編程要慎重使用,做爲面向對象編程的一種補充。

做者:Owen Jia

相關文章
相關標籤/搜索