理解AOP
我覺得面向?qū)ο蠛芎玫亟鉀Q了軟件系統(tǒng)中職責(zé)劃分的問題.借助于面向?qū)ο?軟件開發(fā)人員一般的,都可以將需求里的名詞轉(zhuǎn)換成系統(tǒng)中的對象,動詞轉(zhuǎn)換為對象里的方法.這樣非常符合人的思維方式,非常自然.
但是,問題是某些需求卻偏偏不是能用這樣的”名詞”和”動詞”就能完美的描述出來的,假如這樣的問題:需要對系統(tǒng)中的某些方法進(jìn)行事務(wù)處理,這種需要事務(wù)代碼散布在多個類中.面對這種需求,應(yīng)該怎么辦呢?最直接的辦法就是:創(chuàng)建一個基類(接口)或者一個助手,將事務(wù)處理的功能放在其中,并讓所有需要事務(wù)功能的類繼承這個基類(接口)或者使用這個助手.加入這樣的.需要修改的地方就會分散在多個文件中.這樣大的修改量,無疑會增加出錯的幾率,并且加大系統(tǒng)維護(hù)的難度,如圖:
因此,面向方面的編程(Aspect Oriented Programming,AOP)應(yīng)運(yùn)而生.AOP為開發(fā)者提供了一種描述橫切關(guān)注點(diǎn)的機(jī)制,并能夠自動將橫切關(guān)注點(diǎn)織入到面向?qū)ο蟮能浖到y(tǒng)中,從而實(shí)現(xiàn)了橫切關(guān)注點(diǎn)的模塊化.通過劃分Aspect代碼,橫切關(guān)注點(diǎn)變得容易處理.開發(fā)者可以在編譯時更改,插入或除去系統(tǒng)的Aspect,甚至重用系統(tǒng)的Aspect.” OOP只用于表示對象之間的泛化-特化(generalization-specialization)關(guān)系(通過繼承來表現(xiàn)),而對象之間的橫向關(guān)聯(lián)則完全用AOP來表現(xiàn). 這樣,很多給對象之間橫向關(guān)聯(lián)增加靈活性的設(shè)計模式(例如Decorator等)將不再必要.”,如圖:
Spring中的Ioc
想一想以前在使用工廠模式的時候,在最早的情況下,每個工廠可能都是一個Singleton,生成對象的代碼被寫死在了類里面.后來人們覺這樣還是耦合程度太高,還不夠靈活.所以把對象的類名寫在一個XML文件里,這樣一來.問題又來了,每個工廠都有自己的讀取配置文件的代碼,通過讀取XML文件,或者通過讀取Properties,工廠里充滿了亂糟糟的和業(yè)務(wù)邏輯完全不相關(guān)的配置管理代碼,維護(hù)起來很不方便,.而Spring通過”組件工廠”把這些都集成在了一起,用一個統(tǒng)一的BeanFactory來管理這些配置,而且提供了更高一級的抽象:ApplicationContext
Ioc好像很神奇的樣子,其實(shí)原理和實(shí)現(xiàn)都很簡單,就是將要使用的對象都用XML來定義,用反射來生成,用注射的方式來使用. 其實(shí)Ioc是工廠模式的升華,Ioc可以被看作是一個大工廠,只不過這個大工廠里要生成的對象都是在XML文件中給出定義的,然后利用Java的“反射”編程,根據(jù)XML中給出的類名生成相應(yīng)的對象。從實(shí)現(xiàn)來看,Ioc是把以前在工廠方法里寫死的對象生成代碼,改變?yōu)橛?/SPAN>XML文件來定義,也就是把工廠和對象生成這兩者獨(dú)立分隔開來,目的就是提高靈活性和可維護(hù)性。
Template Method和回調(diào)在框架中的使用
Template模式主要是用來解決這樣的一個問題:當(dāng)你知道算法的具體步驟,但不知道如何去執(zhí)行這些步驟.Template把如何執(zhí)行這些步驟的方法都封裝成抽象的函數(shù),并且提供一個正確的順序去執(zhí)行這些步驟,而具體子類實(shí)現(xiàn)這些處理各個步驟的抽象方法.
業(yè)務(wù)邏輯抽象到超類集中化就是所謂的”控制反轉(zhuǎn)”了.在傳統(tǒng)的類庫中,一般是由客戶端來調(diào)用類庫里的方法.而在這里,卻是框架控制了用戶流程,具體的子類只是要求履行一個明確的契約.在Spring中的MVC框架里,jdbc包里.都大量的使用了Template模式.
而Java中的回調(diào)函數(shù)主要是在實(shí)現(xiàn)事件驅(qū)動模型的時候使用的,但是在Spring里面,回調(diào)被賦予了新的意義:通過回調(diào)接口(函數(shù))來實(shí)現(xiàn)可擴(kuò)展性.如jdbc包的RowcallbackHandler.