Spring學習筆記 什麼是AOP – JAVA編程語言程序開發技術文章

AOP, 全稱Aspect oriented programming,經常被翻譯成面向切面編程或者面向方面編程。很多人開始的時候會產生一個問題,AOP(面向切面編程)與OOP(面向對象編程)的區別是什麼。其實AOP與OOP可以理解為不在同一層面上的兩個獨立的定義。也就是說其實這兩個東西沒法去做一個對等的比較,OOP專註於對象,我們利用對象的屬性,行為來解決現實中的問題,而AOP則用來在使用OOP解決問題的過程中增強解決問題的能力,實現更好的模塊化。

 

什麼是切面?

切面可以理解為我們程序中許多並無關聯的對象、子程序所共同擁有的需要關註的方面,通常遍佈於整個程序中,比如我們需要在許多代碼邏輯中增加安全性保障的代碼(大部分這些代碼都是相同的),比如在執行一個方法前後要進行日志記錄,比如在執行方法時要實現事務,保證操作的原子性等等。這些一個共同點就是我們程序中需要關註的但是與實際業務邏輯無關。在利用AOP以前,它分散於整個程序中並混雜在業務邏輯代碼中,假如對於安全性考慮需要變更安全性相關代碼,則需要改動大量原先混雜在業務邏輯中的安全性處理代碼。類似這種需要考慮的方面我們叫他切面,也就是Aspect。

 

AOP能做什麼?

AOP可以從增強模塊化以及降低切面與業務邏輯的耦合度來增強OOP程序。使用AOP可以為需要某些特定功能的對象集合增加功能而不必修改這些對象的類代碼。也就是我們將與實際業務邏輯無關但是需要關註的部分提取出來通過AOP來動態的添加到業務邏輯代碼中。即使這些Aspect的實現機制以及代碼進行瞭修改,隻需改動一處而不會影響原有業務邏輯代碼。

 

Spring中的AOP

與同樣實現AOP的AspectJ不同,AspectJ將附加功能加入到目標對象中進行編譯,Spring中附加功能與目標對象是分開的,在runtime時動態增加到目標對象中。這通常是通過Proxy實現的(可以看看設計模式中的代理模式,Spring的AOP就是基於Proxy實現的)。也因為Spring沒有將附加功能與目標對象混合後編譯所以Spring的在為對象增加附加功能隻能實現在method(方法)的級別。相當於隻能在執行某個method前或之後增加特定功能,而無法在方法體內部截斷並增加功能。Spring通過配置文件來隨時對一系列特定的對象增加、修改或取消特定功能而使程序不受其影響,也就是說這一系列對象即使沒有通過Spring的AOP增加應用的功能時也是可以正常運行的。可以理解為這一系列對象根本不知道自己是否通過AOP被增加瞭某些功能。

發佈留言