爲了完成上述併發訪問同一資源的功能,須要引入鎖Lock的概念,也就是說,某個時刻,當有一個訪問類訪問這個數據對象時,這個數據對象必須上鎖Locked,用完後就當即解鎖unLocked,再供其它訪問類訪問。
應用範圍
很明顯,
AOP很是適合開發J2EE容器服務器,JBoss 4.0正是使用AOP框架進行開發。
具體功能以下:
Authentication 權限
Lazy loading 延時加載
Debugging 調試
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization性能優化
Persistence 持久化
Synchronization 同步
【AOP有必要嗎?】
固然,上述應用範例在沒有使用AOP狀況下,也獲得瞭解決,例如JBoss 3.XXX也提供了上述應用功能,而且沒有使用AOP。
可是,使用AOP可讓咱們從一個更高的抽象概念來理解軟件系統,AOP也許提供一種有價值的工具。能夠這麼說:由於使用AOP結構,JBoss 4.0的源碼要比JBoss 3.X容易理解多了,這對於一個大型複雜系統來講是很是重要的。
從另一個方面說,好像不是全部的人都須要關心AOP,它多是一種架構設計的選擇,若是選擇J2EE系統,AOP關注的上述通用方面都已經被J2EE容器實現了,J2EE應用系統開發者可能須要更多地關注行業應用方面aspect。
傳統的程序一般表現出一些不能天然地適合單一的
程序模塊或者是幾個緊密相關的程序模塊的行爲,AOP 將這種行爲稱爲橫切,它們跨越了給定編程模型中的典型職責界限。橫切行爲的實現都是分散的,
軟件設計師會發現這種行爲難以用正常的邏輯來思考、實現和更改。最多見的一些橫切行爲以下面這些:
日誌記錄,跟蹤,優化和監控
事務的處理
持久化
性能的優化
系通通一的認證、權限管理等
應用系統的異常捕捉及處理
針對具體行業應用的橫切行爲
前面幾種橫切行爲都已經獲得了密切的關注,也出現了各類有價值的應用,但也許從此幾年,AOP 對針對具體行業應用的貢獻會成爲使人關注的焦點。
實現項目
AOP是一個概念,並無設定具體語言的實現,它能克服那些只有單繼承特性語言的缺點(如Java),AOP具體實現有如下幾個項目:
AspectJ (TM): 建立於Xerox PARC. 有近十年曆史,成熟
缺點:過於複雜;破壞封裝;須要專門的Java
編譯器。
動態AOP:使用JDK的動態代理API或
字節碼Bytecode處理技術。
基於動態代理API的具體項目有:
JBoss 4.0 JBoss 4.0服務器
基於字節碼的項目有:
aspectwerkz ,spring
做用
面向過程編程離咱們已經有些遙遠,
面向對象編程正主宰着軟件世界。當每一個新的
軟件設計師都被要求掌握如何將需求功能轉化成一個個類,而且定義它們的
數據成員、行爲,以及它們之間複雜的關係的時候,面向切面編程(Aspect-Oriented Programming,AOP)爲咱們帶來了新的想法、新的思想、新的模式。
若是說面向對象編程是關注將需求功能劃分爲不一樣的而且相對獨立,封裝良好的類,並讓它們有着屬於本身的行爲,依靠繼承和
多態等來定義彼此的關係的話;那麼面向切面編程則是但願可以將通用需求功能從不相關的類當中分離出來,可以使得不少類共享一個行爲,一旦發生變化,沒必要修改不少類,而只須要修改這個行爲便可。
面向切面編程是一個使人興奮不已的新模式。就開發軟件系統而言,它的影響力必將會和有着數十年應用歷史的
面向對象編程同樣巨大。
面向切面編程和麪向對象編程不但不是互相競爭的技術並且彼此仍是很好的互補。面向對象編程主要用於爲同一對象層次的公用
行爲建模。它的弱點是將公共行爲應用於多個無關對象模型之間。而這偏偏是面向切面編程適合的地方。有了 AOP,咱們能夠定義交叉的關係,並將這些關係應用於跨模塊的、彼此不一樣的對象模型。AOP 同時還可讓咱們層次化功能性而不是嵌入功能性,從而使得代碼有更好的可讀性和易於維護。它會和麪向對象編程合做得很好。
實現
AOP 是一個概念,一個規範,自己並無設定具體語言的實現,這實際上提供了很是廣闊的發展的空間。AspectJ是AOP的一個很悠久的實現,它可以和 Java 配合起來使用。
介紹 AspectJ 的使用和編碼不是本文的目的,你能夠在 Google 上找到不少有關它的材料。
這裏只是重溫 AspectJ 中幾個必需要了解的概念:
Aspect: Aspect 聲明相似於 Java 中的類聲明,在 Aspect 中會包含着一些 Pointcut 以及相應的 Advice。
Joint point:表示在程序中明肯定義的點,典型的包括方法調用,對類成員的訪問以及
異常處理程序塊的執行等等,它自身還能夠嵌套其它 joint point。
Pointcut:表示一組 joint point,這些 joint point 或是經過邏輯關係組合起來,或是經過通配、
正則表達式等方式集中起來,它定義了相應的 Advice 將要發生的地方。
Advice:Advice 定義了在 pointcut 裏面定義的程序點具體要作的操做,它經過 before、after 和 around 來區別是在每一個 joint point 以前、以後仍是代替執行的代碼。
下面要討論的這些問題,也許正是接觸了 AOP 以後所困惑的。
AOP 幫助咱們解決了新的問題沒有?
AOP 並無幫助咱們解決任何新的問題,它只是提供了一種更好的辦法,可以用更少的工做量來解決現有的一些問題,而且使得系統更加健壯,可維護性更好。同時,它讓咱們在進行系統架構和
模塊設計的時候多了新的選擇和新的思路。
工業化應用
這個問題很難回答,其實最好的答案就是嘗試,用成功的項目或是產品來回答。Jboss 4.0 就是徹底採用 AOP 的思想來設計的 EJB 容器,它已經經過了 J2EE 的認證,而且在工業化應用中證實是一個優秀的產品。相信在不遠的未來,會出現更多采用 AOP 思想設計的產品和行業應用。
小結
AOP 正向咱們走來,咱們須要關注的是怎麼樣使得它可以爲咱們的軟件系統的設計和實現帶來幫助。本文旨在給你們一點啓發,可以在更多的領域更深刻的應用 AOP 的思想。