少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          AOP

          面向切面編程(AOP)通過提供另外一種思考程序結(jié)構(gòu)的途經(jīng)來彌補面向?qū)ο缶幊蹋∣OP)的不足。在OOP中模塊化的關鍵單元是類(classes),而在AOP中模塊化的單元則是切面。切面能對關注點進行模塊化,例如橫切多個類型和對象的事務管理。(在AOP術(shù)語中通常稱作橫切(crosscutting)關注點。)

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

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

          AOP在Spring Framework中的作用

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

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

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

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

          Spring AOP:

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

          AspectJ AOP:

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

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

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

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


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

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

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

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

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









          posted on 2015-04-20 02:07 abin 閱讀(441) 評論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 博湖县| 合川市| 嘉义市| 阳谷县| 武川县| 宝清县| 满洲里市| 拜城县| 永仁县| 虹口区| 连城县| 南涧| 临海市| 栾川县| 青龙| 潜山县| 罗平县| 乌鲁木齐县| 遵义县| 澄江县| 封开县| 吴川市| 凤阳县| 靖边县| 丹江口市| 遂昌县| 姚安县| 新干县| 剑河县| 横山县| 武平县| 宜宾市| 永顺县| 合阳县| 新昌县| 兴宁市| 武宣县| 双桥区| 红原县| 遂宁市| 东莞市|