少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          AOP

          面向切面編程(AOP)通過提供另外一種思考程序結構的途經來彌補面向對象編程(OOP)的不足。在OOP中模塊化的關鍵單元是類(classes),而在AOP中模塊化的單元則是切面。切面能對關注點進行模塊化,例如橫切多個類型和對象的事務管理。(在AOP術語中通常稱作橫切(crosscutting)關注點。)

          AOP框架是Spring的一個重要組成部分。但是Spring IoC容器并不依賴于AOP,這意味著你有權利選擇是否使用AOP,AOP做為Spring IoC容器的一個補充,使它成為一個強大的中間件解決方案。

          AOP即Aspect-Oriented Programming的縮寫,中文意思是面向切面(或方面)編程。AOP實際上是一種編程思想,可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種思想。

          AOP在Spring Framework中的作用

          • 提供聲明式企業服務,特別是為了替代EJB聲明式服務。最重要的服務是聲明性事務管理

          • 允許用戶實現自定義切面,用AOP來完善OOP的使用。

          目前AOP主要有:Spring AOP ,JBOSS AOP ,AspectJ AOP

          AOP與OOP:可以理解為OOP是縱向的采用繼承樹形式的。而AOP是橫向的

          Spring AOP:

          由于Spring AOP是容易實現的,如果你計劃在Spring Beans之上將橫切關注點模塊化,Spring的這一目標將是要點之一。但同樣的目標也可能成為一個限制,如果你用的是普通的Java對象而不是Spring beans,并基于此將橫切關注點模塊化的話。另一方面,AspectJ可用于基于普通Java對象的模塊化,但在實施之前需要良好的關于這個主題的知識。
           
          Spring AOP致力于提供一種能夠與Spring IoC緊密集成的面向方面框架的實現,以便于解決在開發企業級項目時面臨的常見問題。明確你在應用橫切關注點(cross-cutting concern)時(例如事物管理、日志或性能評估),需要處理的是Spring beans還是POJO。如果正在開發新的應用,則選擇Spring AOP就沒有什么阻力。但是如果你正在維護一個現有的應用(該應用并沒有使用Spring框架),AspectJ就將是一個自然的選擇了。為了詳細說明這一點,假如你正在使用Spring AOP,當你想將日志功能作為一個通知(advice)加入到你的應用中,用于追蹤程序流程,那么該通知(Advice)就只能應用在Spring beans的連接點(Joinpoint)之上。
           

          AspectJ AOP:

          使用“AspectJ”你可以在任何Java對象上應用通知,而不需要在任何文件中創建或配置任何bean。
           

          另一個需要考慮的因素是,你是希望在編譯期間進行織入(weaving),還是編譯后(post-compile)或是運行時(run-time)。Spring只支持運行時織入。如果你有多個團隊分別開發多個使用Spring編寫的模塊(導致生成多個jar文件,例如每個模塊一個jar文件),并且其中一個團隊想要在整個項目中的所有Spring bean(例如,包括已經被其他團隊打包了的jar文件)上應用日志通知(在這里日志只是用于加入橫切關注點的舉例),那么通過配置該團隊自己的Spring配置文件就可以輕松做到這一點。之所以可以這樣做,就是因為Spring使用的是運行時織入。

           因為Spring基于代理模式(使用CGLIB),它有一個使用限制,即無法在使用final修飾的bean上應用橫切關注點。因為代理需要對Java類進行繼承,一旦使用了關鍵字final,這將是無法做到的。

          在這種情況下,你也許會考慮使用AspectJ,其支持編譯期織入且不需要生成代理。


          于此相似,在static和final方法上應用橫切關注點也是無法做到的。因為Spring基于代理模式。如果你在這些方法上配置通知,將導致運行時異常,因為static和final方法是不能被覆蓋的。在這種情況下,你也會考慮使用AspectJ,因為其支持編譯期織入且不需要生成代理。
           
          缺點:
          使用AspectJ的一個間接局限是,因為AspectJ通知可以應用于POJO之上,它有可能將通知應用于一個已配置的通知之上。對于一個你沒有注意到這方面問題的大范圍應用的通知,這有可能導致一個無限循環。
           

          面向切面編程,把散落在程序中的公共部分提取出來,做成切面類,這樣的好處在于,代碼的可重用,一旦涉及到該功能的需求發生變化,只要修改該代碼就行,否則,你要到處修改,如果只要修改1、2處那還可以接受,萬一有1000處呢。 
          AOP底層的東西就是JDK動態代理和CGLIB代理,說白了就是增強類的功能。 
          最常用的AOP應用在數據庫連接以及事務處理上。

          AOP:面向切面編程。(Aspect-Oriented Programming)
          AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。
          將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去。

          實現AOP的技術,主要分為兩大類:一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼.

           AOP(Aspect Orient Programming),作為面向對象編程的一種補充,廣泛應用于處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、緩存、對象池管理等。 AOP 實現的關鍵就在于 AOP 框架自動創建的 AOP 代理,AOP 代理則可分為靜態代理和動態代理兩大類,其中靜態代理是指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;而動態代理則在運行時借助于 JDK 動態代理、CGLIB 等在內存中"臨時"生成 AOP 動態代理類,因此也被稱為運行時增強。









          posted on 2015-04-20 02:07 abin 閱讀(436) 評論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 右玉县| 康平县| 休宁县| 双峰县| 周至县| 清流县| 昌平区| 新乡市| 和龙市| 当涂县| 永登县| 沽源县| 敖汉旗| 武安市| 准格尔旗| 昌乐县| 长丰县| 获嘉县| 宿州市| 文安县| 西青区| 丁青县| 无棣县| 保亭| 扶风县| 滁州市| 昌吉市| 许昌市| 古交市| 富源县| 讷河市| 大英县| 大同市| 枣庄市| 夹江县| 托里县| 秦皇岛市| 古田县| 鄢陵县| 墨竹工卡县| 密山市|