面向方面開發人員可以採用的進階技術
簡介:依賴項插入和面向方面編程是互補的技術,所以想把它們結合在一起 使 用是很自然的。請跟隨 Adrian Colyer 一起探索兩者之間的關係,並瞭解怎樣 才 能把它們組合在一起,來促進進階的依賴項插入情境。
依賴項插入和面向方面編程(AOP)是兩個關鍵的技術,有助於在公司專屬應用程式程 序中簡化和純化領域模型和應用程式分層。依賴項插入封裝了資源和協調器發現的 細節,而方面可以(在其他事情中)封裝中介軟體服務調用的細節 —— 例如,提 供事務和安全性管理。因為依賴項插入和 AOP 都會形成更簡單、更容易測試的 基 於對象的應用程式,所以想把它們結合在一起使用是很自然的。方面可以協助把 依賴項插入的能力帶到更廣的對象和服務中,而依賴項插入可以用來對方面本身 進行配置。
在這篇文章中,我將介紹如何把 Spring 架構的依賴項插入與用 AspectJ 5 編寫的方面有效地結合在一起。我假設您擁有基本的 AOP 知識(如果沒有這方 面 知識 ,可以在 參考資料 中找到一些良好的起點),所以我的討論將從對基於 依 賴項插入的解決方案中包含的關鍵角色和職責的分析開始。從這裡,我將介紹如 何通過依賴項插入配置單體(singleton)方面。因為配置非單體方面與佈建網域 對 象共用許多公用內容,所以後面我會研究一個應用於這兩者的簡單解決方案。總 結這篇文章時,我會介紹如何為多個進階依賴項插入情境使用方面,其中包括基 於介面的插入和重複插入。
請參閱 下載 獲得文章的原始碼,參閱 參考資料 下載 AspectJ 或 Spring 架構,運行樣本需要它們。
什麼是依賴項插入?
在 Domain-Driven Design 一書中,Eric Evans 討論了如何把對象與建立對 象的配置和關聯的細節隱藏起來:
對象的大部分威力在於對象內部複雜的配置和關聯。應當對對象進行提煉, 直 到與對象的意義或者在互動中支援對象的作用無關的東西都不存在為止。這個中 間迴圈的責任很多。如果讓複雜物件負責自己的建立,就會出現問題。
Evans 接著提供了一個汽車引擎的樣本:它的眾多組件一起協作,執行引擎 的 職責。雖然可以把引擎塊想像成把一組活塞插入氣缸,但是這樣的設計會把引擎 明顯地弄複雜。相反,技工或機器人裝配引擎,引擎本身只考慮自己的操作。
雖然這個樣本是我從書中介紹用於複雜物件建立的工廠 概念一節中取出的, 但是我們也可以用這個概念解釋依賴項插入技術的動機。
從協作到合約
針對這篇文章的目的,可以把依賴項插入想像成對象和對象的執行環境之間 的 合約。對象(執行 ResourceConsumer、 Collaborator 和 ServiceClient 的其 中一個角色或全部角色)同意不出去搜尋自己需要的資源、它與之協作的合作夥 伴或它使用的服務。相反,對象提供一種機制,讓這些依賴項可以提供給它。接 下來,執行環境同意在對象需要它的依賴項之前,向對象提供所有的依賴項。
解析依賴項的方法在不同的情境中各有不同。例如,在單元測試用例中,對 象 的執行環境是測試案例本身,所以測試設定代碼有責任直接滿足依賴項。在整合 測試或應用程式在生產環境時,代理 負責尋找滿足對象依賴項的資源,並把它 們 傳遞給對象。代理的角色通常是由輕量級容器扮演的,例如 Spring 架構。不管 依賴項是如何解析的,被配置的對象通常不知道這類細節。在第二個樣本中,它 可能還不知道代理的存在。