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在Spring Framework中的作用
提供聲明式企業(yè)服務,特別是為了替代EJB聲明式服務。最重要的服務是聲明性事務管理。
允許用戶實現(xiàn)自定義切面,用AOP來完善OOP的使用。
目前AOP主要有:Spring AOP ,JBOSS AOP ,AspectJ AOP
AOP與OOP:可以理解為OOP是縱向的采用繼承樹形式的。而AOP是橫向的
Spring AOP:
AspectJ AOP:
在這種情況下,你也許會考慮使用AspectJ,其支持編譯期織入且不需要生成代理。
面向切面編程,把散落在程序中的公共部分提取出來,做成切面類,這樣的好處在于,代碼的可重用,一旦涉及到該功能的需求發(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)代理類,因此也被稱為運行時增強。