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實現除了AspectJ外,已知的還有JBoss AOP、Spring AOP等。
這裏只介紹AspectJ和SpringAOP,重點是他們不一樣點。
AspectJ採用靜態織入方式進行切面織入原代碼,提供獨立的編譯器把切面和原代碼的java文件編織成一個新的class文件。提供了詳細的編譯日誌和調試工具,編譯時間長可是運行效率高。
鏈接點的支持範圍:
關聯鏈接點通知方式:
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