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

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

輕量級IoC容器來擴(kuò)展ANT享受SPRING(圖)

2019-11-18 12:53:50
字體:
供稿:網(wǎng)友

  摘要
  
  這篇文章介紹了通過ANT任務(wù)的擴(kuò)展來實(shí)現(xiàn)IoC治理對象或非治理對象的執(zhí)行。同時(shí)也介紹了OGNL(對象圖形導(dǎo)航語言)如何被用來使ANT執(zhí)行任何方法表達(dá)式,包括帶有運(yùn)行時(shí)參數(shù)的。也介紹了如何使用JUNIT來測試ANT的擴(kuò)展。此外,還包含一個(gè)使用SPRING框架的實(shí)現(xiàn)。Ant-IoC的組合為創(chuàng)建松耦合的軟件開發(fā)支持任務(wù)開創(chuàng)了新的天地。
  
  我需要增加一個(gè)基于ANT驅(qū)動(dòng)的新任務(wù),并且我用SPRING(一個(gè)輕量級的IoC框架)來實(shí)現(xiàn)這個(gè)任務(wù)。我?guī)缀鯖]有碰到什么問題,因?yàn)镮oC容器是非侵入式的,這很輕易創(chuàng)建一個(gè)包裝或者直接使用對象來實(shí)現(xiàn)任務(wù)。于是我開始想知道是否ANT可以直接使用SPRING配置的對象,然后重用已經(jīng)定義和測試的依靠圖和配置。那為什么還要重復(fù)和引入波紋效應(yīng)或其他問題呢?假如IoC容器果真能提供這樣的便利,就可以保證更直接的使用。
  
  這篇文章介紹了這種方法并且演示了一種概念上的實(shí)現(xiàn)。剛接觸ANT擴(kuò)展的開發(fā)者會發(fā)現(xiàn)這個(gè)例子十分有趣。
  
  ANT擴(kuò)展
  
  為了給ANT增加自定義任務(wù),ANT手冊建議使用為這個(gè)目的而提供的類,如Task類。但是這個(gè)建議不是強(qiáng)制的,ANT可以執(zhí)行任何擁有execute()方法的類(當(dāng)然ANT也可以通過使用exec或java任務(wù)來執(zhí)行任何程序,但那是另一種擴(kuò)展方式)。ANT也支持集成這些任務(wù)擴(kuò)展到各種類型的屬性或xml文件中。
  
  給ANT增加一個(gè)自定義任務(wù)的最佳方法是通過Task擴(kuò)展來重用IoC框架。因此,執(zhí)行獨(dú)立應(yīng)用的Task必須設(shè)置和使用建立在ANT基礎(chǔ)上的框架內(nèi)置的對象和資源。
  
  控制反轉(zhuǎn)
  
  IoC設(shè)計(jì)模式,也稱作DI(依靠注射)。在框架的上下文中,這與JAVA對象的組成有關(guān)。在IoC框架上增加的投資很大一部分是由于SPRING框架的開發(fā)人員演示了在一個(gè)IoC/AOP/XML/JavaBeans輕量框架中的協(xié)同作用,而這正是通過答應(yīng)為其他API或組件創(chuàng)建強(qiáng)大的抽象層來提供超越DI能力的原因。SPRING本身就是一個(gè)使用IoC的例子。ANT看起來與IoC容器相適應(yīng),因?yàn)樗彩腔赬ML或者JavaBean的,從某方面來說,他也使用了IoC。
  
  需求
  
  我們的ANT IoC任務(wù)擴(kuò)展需求可以通過角色/目標(biāo)/需求的格式來定義(這里的需求不分順序):
  
  ●角色:開發(fā)人員
  ●目標(biāo):修改IoC任務(wù)
  ●需求:
  在任何代碼改變或構(gòu)建后執(zhí)行回歸測試
  很輕易在回歸測試中增加新的測試用例
  支持不同的IoC框架
  通過修改ANT日志的級別或IoC日志的配置使調(diào)試時(shí)可以得到更有效的輸出
  
  ●角色:構(gòu)建創(chuàng)建人
  ●目標(biāo):編輯ANT目標(biāo)并使用任務(wù)來定義IoC容器的輸入或輸出Bean
  ●需求:
  設(shè)置IoC描述符的位置
  在不需要容器時(shí),定義FQCN(完全限定類名)作為目標(biāo)
  使用IoC時(shí),設(shè)置POJO(普通JAVA對象)Bean名,缺省為antBean
  定義目標(biāo)方法名,缺省為execute
  定義一個(gè)調(diào)用可以帶參數(shù)的表達(dá)式的方法
  定義可以插入目標(biāo)Bean的屬性,用來復(fù)寫容器屬性
  定義目標(biāo)的元素文本
  沒有必要定義用來處理Ant/IoC組合的新類
  為了各種擴(kuò)展需要重用現(xiàn)存的屬性文件
  
  ●角色:任務(wù)擴(kuò)展對象
  ●目標(biāo):執(zhí)行對象方法
  ●需求:
  執(zhí)行在IoC Bean定義中定義的POJO
  執(zhí)行容器外的定義類
  假如沒有定義使用缺省的Bean名antBean
  執(zhí)行簡單的方法,缺省為execute()
  執(zhí)行帶可選參數(shù)的方法表達(dá)式
  假如目標(biāo)是ANT相關(guān)的則插入工程
  插入動(dòng)態(tài)屬性
  
  任務(wù)
  
  支持這些需求的任務(wù)定義是SpringContextTask
  
  描述
  
  這個(gè)任務(wù)執(zhí)行由SPRING容器治理的或者是未治理的FQCN的對象的方法。目前還不支持SRPING Bean定義引用的Classpath。
  
  SpringContextTask的參數(shù)如下表所示:
  
 輕量級IoC容器來擴(kuò)展ANT享受SPRING(圖)

  例子
  
  最簡單的應(yīng)用我們的ANT任務(wù)擴(kuò)展的例子如下:
  
  &!-- create the task definition -->&taskdef name="runBean" classpathref="testpath"   classname="jbetancourt.ant.task.spring.SpringContextTask"/>&target name="simpleAppContextUseWithDefaults">  &runBean beanLocations="applicationContext.xml">&/runBean>&/target>
  
  simpleAppContextUseWithDefaults目標(biāo)執(zhí)行在文件路徑中找到的Bean定義文件applicationContext.xml中的Bean名為antBean的execute()方法。路徑屬性名是復(fù)數(shù)的以便將來支持多個(gè)Bean定義文件。
  
  Bean的執(zhí)行類似ANT執(zhí)行對象的方法;然而,這里是IoC容器來治理Bean。容器可以增加事務(wù)依靠,包裝數(shù)據(jù)庫,設(shè)置網(wǎng)絡(luò)服務(wù)代理,使用遠(yuǎn)程甚至提供AOP代理來代替實(shí)際目標(biāo)Bean。我們的方法簡化了配置,因?yàn)锳NT腳本不再需要知道如何配置對象,非凡是復(fù)雜的對象。但是假如ANT腳本確實(shí)需要為服務(wù)調(diào)用設(shè)置特定的屬性時(shí)會怎么樣呢:
  
  &target name="publish">   &spring     beanLocations="applicationContext.xml"     beanName="siteGenerator"      methodName="generateSite"     host="${host.site.url}"     port="${site.port}">     Made a few tweaks. Removed some sentence fragments.     &/spring>            &/target>
  
  注重因?yàn)槿蝿?wù)名已經(jīng)在taskdef中定義了,使用的名字將依靠于ANT的taskdef定義。這兒任務(wù)名是spring。現(xiàn)在我們定義Bean名字和調(diào)用的方法。元素文本也會被放到目標(biāo)Bena中。在這個(gè)例子中,文本是一個(gè)發(fā)布的注釋。
  
  通過使用ANT的動(dòng)態(tài)屬性功能,我們也可以將需要的屬性放到目標(biāo)對象中。通常在ANT文件中一個(gè)屬性被解析時(shí),對應(yīng)的set方法會被調(diào)用。使用動(dòng)態(tài)屬性,非對象屬性或字段會通過setDynamicAttribute()方法被增加到對象中。通常因?yàn)槿萜饕呀?jīng)包裝了其中的Bean的屬性,這種屬性注入提供了一種重寫的能力。但是,是否這樣會將配置復(fù)雜化?我們將不得不維護(hù)ANT任務(wù)使用的屬性及治理對象所需要的屬性。
  
  當(dāng)然這不是必須的;如例子中的SPRING用法,相同的屬性文件被ANT和SPRING同時(shí)使用— 即使使用了ANT的占位符語法(${...})。SPRING提供了這種目的的類,如PropertyPlaceHolderConfigurer。因此,這種方法不會引入新的配置惡夢。可參考旁注“屬性中的屬性”獲得更多的幫助。
  
  另一種放置屬性的方法是通過使用call屬性來調(diào)用帶運(yùn)行時(shí)參數(shù)的目標(biāo)方法或者嵌套的methodCall元素,他的內(nèi)容是java表達(dá)式。這個(gè)元素很輕易使用因?yàn)閄ML需要的符號如實(shí)體轉(zhuǎn)義符可以用CDATA來避免:
  
  call="generateSite("${host.site.url}","${site.port}")" Or better: &methodCall>&![CDATA[  generateSite("${host.site.url}","${site.port}")  ]]>&/methodCall>
  
  因此先前的例子可以如下寫法:
  
  &target name="publish">   &spring beanLocations="applicationContext.xml" beanName="siteGenerator">     &methodCall> generateSite("${host.site.url}","${site.port}") &/methodCall>     Made a few tweaks. Removed some sentence fragments.     &/spring>            &/target>
  
  當(dāng)然,目標(biāo)對象必須包含需要的方法和參數(shù)標(biāo)識符。
  
  上面的例子簡單介紹了SpringContextTask方法。可能他們可以有其他或更好的實(shí)現(xiàn)。
  
  有人可能會對這個(gè)Task擴(kuò)展的特性有疑問,如調(diào)用任何方法的功能。這個(gè)功能甚至可以被移除,因?yàn)槿魏尾话琫xecute()方法的目標(biāo)Bean可以被包裝,一個(gè)任務(wù)在IoC框架中可能更輕易完成。但既然通過OGNL(后面會討論)支持方法表達(dá)式很輕易,那么方法參數(shù)的支持也不是個(gè)問題了。
  
  有趣的是,既然任何方法可以被調(diào)用,那么同一對象可以在同一個(gè)構(gòu)建文件中被重用來提供不同的服務(wù),這樣就可以在執(zhí)行需要很多屬性的任務(wù)中減少過度的ANT腳本混亂了。假如任務(wù)實(shí)例可以通過ID來引用的話這個(gè)功能就會有實(shí)際意義了。我們可以象下面這樣寫:
  
  &spring id="metrics" beanLocations="metricsContext.xml" beanName="main"   exampleAttribute="a value" and so forth . . ./>  &target name="ComputeMetrics">   &spring refid="metrics" call="computeNCss"/>   &spring refid="metrics" call="computeCCM"/>   &spring refid="metrics" call="findBugs"/>  &/target>  &target name="genDocs">   &!- here are calls to other types of docs '/>   &!- now call the metric docs '/>   &spring refid="metrics" call="createDocs"/>  &/target>
  
  現(xiàn)在我們擁有更易讀的格式而隱藏了更多的信息。我們不再關(guān)心容器中有什么,只要那兒有一個(gè)入口點(diǎn)—main.那個(gè)Bean可以是實(shí)際的Bean或者通過依靠注射代理給其他工具如PMD, JavaNCSS, 或者FindBugs。
  
  我沒有選擇通過ID引用重用SpringContextTask的開發(fā)方式。另一種完成重用的方式是在上下文中使用不同的Bean,如:
  
  &target name="ComputeMetrics">  &spring beanLocations="metricsContext.xml" beanName="computeNCSS"/>  &spring beanLocations="metricsContext.xml" beanName="computeCCM"/>  &spring beanLocations="metricsContext.xml" beanName="findBugs"/>&/target>
  
  但在這個(gè)例子中的每一個(gè)Bean必須有一個(gè)execute()方法來啟動(dòng)服務(wù)。而且每一個(gè)Bean實(shí)際上只是引用同樣的類或?qū)ο蟆?br />  
  現(xiàn)在需求已經(jīng)確定而

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 分宜县| 杭锦后旗| 吉安县| 南川市| 西乡县| 大理市| 云梦县| 乌拉特前旗| 溧阳市| 小金县| 肃南| 怀宁县| 揭西县| 加查县| 灵丘县| 黎城县| 翼城县| 诸暨市| 长宁区| 筠连县| 平阴县| 凌源市| 乡宁县| 关岭| 民勤县| 昌邑市| 古浪县| 宜兴市| 沂源县| 龙里县| 贡山| 崇礼县| 临沧市| 应用必备| 荆州市| 巴里| 金堂县| 剑河县| 鹤壁市| 长汀县| 屏东市|