国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用AspectJ和Spring進(jìn)行依賴項(xiàng)插入

2019-11-18 11:02:45
字體:
供稿:網(wǎng)友

  依靠項(xiàng)插入和面向方面編程是互補(bǔ)的技術(shù),所以想把它們結(jié)合在一起使用是很自然的。請跟隨 Adrian Colyer 一起探索兩者之間的關(guān)系,并了解怎樣才能把它們組合在一起,來促進(jìn)高級的依靠項(xiàng)插入場景。

  依靠項(xiàng)插入和面向方面編程(AOP)是兩個(gè)要害的技術(shù),有助于在企業(yè)應(yīng)用程序中簡化和純化域模型和應(yīng)用程序分層。依靠項(xiàng)插入封裝了資源和協(xié)調(diào)器發(fā)現(xiàn)的細(xì)節(jié),而方面可以(在其他事情中)封裝中間件服務(wù)調(diào)用的細(xì)節(jié) —— 例如,提供事務(wù)和安全性治理。因?yàn)橐揽宽?xiàng)插入和 AOP 都會(huì)形成更簡單、更輕易測試的基于對象的應(yīng)用程序,所以想把它們結(jié)合在一起使用是很自然的。方面可以幫助把依靠項(xiàng)插入的能力帶到更廣的對象和服務(wù)中,而依靠項(xiàng)插入可以用來對方面本身進(jìn)行配置。

  在這篇文章中,我將介紹如何把 SPRing 框架的依靠項(xiàng)插入與用 aspectJ 5 編寫的方面有效地結(jié)合在一起。我假設(shè)您擁有基本的 AOP 知識(shí)(假如沒有這方面知識(shí) ,可以在 參考資料 中找到一些良好的起點(diǎn)),所以我的討論將從對基于依靠項(xiàng)插入的解決方案中包含的要害角色和職責(zé)的分析開始。從這里,我將介紹如何通過依靠項(xiàng)插入配置單體(singleton)方面。因?yàn)榕渲梅菃误w方面與配置域?qū)ο蠊蚕碓S多公共內(nèi)容,所以后面我會(huì)研究一個(gè)應(yīng)用于這兩者的簡單解決方案。總結(jié)這篇文章時(shí),我會(huì)介紹如何為多個(gè)高級依靠項(xiàng)插入場景使用方面,其中包括基于接口的插入和重復(fù)插入。

  什么是依靠項(xiàng)插入?

  在 Domain-Driven Design 一書中,Eric Evans 討論了如何把對象與建立對象的配置和關(guān)聯(lián)的細(xì)節(jié)隱藏起來:

  對象的大部分威力在于對象內(nèi)部復(fù)雜的配置和關(guān)聯(lián)。應(yīng)當(dāng)對對象進(jìn)行提煉,直到與對象的意義或者在交互中支持對象的作用無關(guān)的東西都不存在為止。這個(gè)中間循環(huán)的責(zé)任很多。假如讓復(fù)雜對象負(fù)責(zé)自己的創(chuàng)建,就會(huì)出現(xiàn)問題。

  Evans 接著提供了一個(gè)汽車引擎的示例:它的眾多部件一起協(xié)作,執(zhí)行引擎的職責(zé)。雖然可以把引擎塊想像成把一組活塞插入氣缸,但是這樣的設(shè)計(jì)會(huì)把引擎明顯地弄復(fù)雜。相反,技工或機(jī)器人裝配引擎,引擎本身只考慮自己的操作。

  雖然這個(gè)示例是我從書中介紹用于復(fù)雜對象創(chuàng)建的工廠 概念一節(jié)中取出的,但是我們也可以用這個(gè)概念解釋依靠項(xiàng)插入技術(shù)的動(dòng)機(jī)。

  從協(xié)作到合約
用AspectJ和Spring進(jìn)行依靠項(xiàng)插入(圖一)參考讀物
關(guān)于依靠項(xiàng)插入的經(jīng)典介紹,請參閱 Martin Fowler 的 “Inversion of Control Containers and the Dependency Injection Pattern”。關(guān)于使用 Spring 的依靠項(xiàng)插入的更多內(nèi)容,請參閱 Professional java Development with the Spring Framework。這兩者的鏈接都在 參考資料 中。
  針對這篇文章的目的,可以把依靠項(xiàng)插入想像成對象和對象的執(zhí)行環(huán)境之間的合約。對象(執(zhí)行 ResourceConsumer、 Collaborator 和 ServiceClient 的其中一個(gè)角色或全部角色)同意不出去搜索自己需要的資源、它與之協(xié)作的合作伙伴或它使用的服務(wù)。相反,對象提供一種機(jī)制,讓這些依靠項(xiàng)可以提供給它。接下來,執(zhí)行環(huán)境同意在對象需要它的依靠項(xiàng)之前,向?qū)ο筇峁┧械囊揽宽?xiàng)。

  解析依靠項(xiàng)的方法在不同的場景中各有不同。例如,在單元測試用例中,對象的執(zhí)行環(huán)境是測試用例本身,所以測試設(shè)置代碼有責(zé)任直接滿足依靠項(xiàng)。在集成測試或應(yīng)用程序在生產(chǎn)環(huán)境時(shí),代理 負(fù)責(zé)尋找滿足對象依靠項(xiàng)的資源,并把它們傳遞給對象。代理的角色通常是由輕量級容器扮演的,例如 Spring 框架。不管依靠項(xiàng)是如何解析的,被配置的對象通常不知道這類細(xì)節(jié)。在第二個(gè)示例中,它可能還不知道代理的存在。

  代理(例如 Spring 框架)有四個(gè)要害職責(zé),在整篇文章中我將不斷提到這些職責(zé),它們是:
  • 確定對象需要配置(通常因?yàn)閷ο髣倓倓?chuàng)建)
  • 確定對象的依靠項(xiàng)
  • 發(fā)現(xiàn)滿足這些依靠項(xiàng)的對象
  • 用對象的依靠項(xiàng)對它進(jìn)行配置
  從下面的各種依靠項(xiàng)插入解決方案可以看出,解決這些職責(zé)有多種策略。
  使用 Spring 進(jìn)行依靠項(xiàng)插入

  在標(biāo)準(zhǔn)的 Spring 部署中,Spring 容器同時(shí)負(fù)責(zé)創(chuàng)建和配置核心應(yīng)用程序?qū)ο螅ǚQ為 bean)。因?yàn)槿萜骷葎?chuàng)建對象,又扮演代理的角色,所以對 Spring 容器來說,確定 bean 已經(jīng)創(chuàng)建而且需要配置是件輕而易舉的小事。通過查詢應(yīng)用程序的元模型,可以確定 bean 的依靠項(xiàng),元模型通常是在 Spring 的配置文件中用 xml 表示的。

  滿足 bean 的依靠項(xiàng)的對象是容器治理的其他 bean。容器充當(dāng)這些 bean 的倉庫,所以可以用名稱查詢它們(或者在需要的時(shí)候創(chuàng)建)。最后,容器用新 bean 的依靠項(xiàng)對其進(jìn)行配置。這通常是通過 setter 插入完成的(調(diào)用新 bean 的 setter 方法,把依靠項(xiàng)作為參數(shù)傳遞進(jìn)去),雖然 Spring 支持其他形式的插入,例如構(gòu)造函數(shù)插入和查詢方法插入(請參閱 參考資料 學(xué)習(xí)關(guān)于使用 Spring 進(jìn)行依靠項(xiàng)插入的更多內(nèi)容。)

  方面的依靠項(xiàng)插入

  像其他對象一樣,方面可以從通過依靠項(xiàng)插入進(jìn)行的配置中受益。在許多情況下,把方面實(shí)現(xiàn)為輕量級控制器 是良好的實(shí)踐。在這種情況下,方面確定什么時(shí)候應(yīng)當(dāng)執(zhí)行某些行為,但是會(huì)委托給協(xié)作器去執(zhí)行實(shí)際的工作。例如,可以用異常處理策略對象配置異常處理方面。方面會(huì)探測出什么時(shí)候拋出了異常,并委托處理器對異常進(jìn)行處理。清單 1 顯示了基本的 RemoteException 處理方面:

清單 1. RemoteException 處理方面


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 柘荣县| 车致| 秦安县| 海门市| 永康市| 太湖县| 湖南省| 蓝山县| 石楼县| 濮阳市| 延长县| 沛县| 兴安盟| 克什克腾旗| 绿春县| 城口县| 荆门市| 新密市| 新营市| 池州市| 监利县| 北海市| 金乡县| 溧阳市| 林周县| 石柱| 太仆寺旗| 股票| 栖霞市| 黔西县| 灵璧县| 聂荣县| 临夏县| 佛坪县| 财经| 永兴县| 黔西县| 会东县| 乐安县| 斗六市| 龙海市|