亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 12:53:50
字體:
來源:轉載
供稿:網友

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

  例子
  
  最簡單的應用我們的ANT任務擴展的例子如下:
  
  &!-- 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目標執行在文件路徑中找到的Bean定義文件applicationContext.xml中的Bean名為antBean的execute()方法。路徑屬性名是復數的以便將來支持多個Bean定義文件。
  
  Bean的執行類似ANT執行對象的方法;然而,這里是IoC容器來治理Bean。容器可以增加事務依靠,包裝數據庫,設置網絡服務代理,使用遠程甚至提供AOP代理來代替實際目標Bean。我們的方法簡化了配置,因為ANT腳本不再需要知道如何配置對象,非凡是復雜的對象。但是假如ANT腳本確實需要為服務調用設置特定的屬性時會怎么樣呢:
  
  &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>
  
  注重因為任務名已經在taskdef中定義了,使用的名字將依靠于ANT的taskdef定義。這兒任務名是spring。現在我們定義Bean名字和調用的方法。元素文本也會被放到目標Bena中。在這個例子中,文本是一個發布的注釋。
  
  通過使用ANT的動態屬性功能,我們也可以將需要的屬性放到目標對象中。通常在ANT文件中一個屬性被解析時,對應的set方法會被調用。使用動態屬性,非對象屬性或字段會通過setDynamicAttribute()方法被增加到對象中。通常因為容器已經包裝了其中的Bean的屬性,這種屬性注入提供了一種重寫的能力。但是,是否這樣會將配置復雜化?我們將不得不維護ANT任務使用的屬性及治理對象所需要的屬性。
  
  當然這不是必須的;如例子中的SPRING用法,相同的屬性文件被ANT和SPRING同時使用— 即使使用了ANT的占位符語法(${...})。SPRING提供了這種目的的類,如PropertyPlaceHolderConfigurer。因此,這種方法不會引入新的配置惡夢??蓞⒖寂宰ⅰ皩傩灾械膶傩浴鲍@得更多的幫助。
  
  另一種放置屬性的方法是通過使用call屬性來調用帶運行時參數的目標方法或者嵌套的methodCall元素,他的內容是java表達式。這個元素很輕易使用因為XML需要的符號如實體轉義符可以用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>
  
  當然,目標對象必須包含需要的方法和參數標識符。
  
  上面的例子簡單介紹了SpringContextTask方法。可能他們可以有其他或更好的實現。
  
  有人可能會對這個Task擴展的特性有疑問,如調用任何方法的功能。這個功能甚至可以被移除,因為任何不包含execute()方法的目標Bean可以被包裝,一個任務在IoC框架中可能更輕易完成。但既然通過OGNL(后面會討論)支持方法表達式很輕易,那么方法參數的支持也不是個問題了。
  
  有趣的是,既然任何方法可以被調用,那么同一對象可以在同一個構建文件中被重用來提供不同的服務,這樣就可以在執行需要很多屬性的任務中減少過度的ANT腳本混亂了。假如任務實例可以通過ID來引用的話這個功能就會有實際意義了。我們可以象下面這樣寫:
  
  &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>
  
  現在我們擁有更易讀的格式而隱藏了更多的信息。我們不再關心容器中有什么,只要那兒有一個入口點—main.那個Bean可以是實際的Bean或者通過依靠注射代理給其他工具如PMD, JavaNCSS, 或者FindBugs。
  
  我沒有選擇通過ID引用重用SpringContextTask的開發方式。另一種完成重用的方式是在上下文中使用不同的Bean,如:
  
  &target name="ComputeMetrics">  &spring beanLocations="metricsContext.xml" beanName="computeNCSS"/>  &spring beanLocations="metricsContext.xml" beanName="computeCCM"/>  &spring beanLocations="metricsContext.xml" beanName="findBugs"/>&/target>
  
  但在這個例子中的每一個Bean必須有一個execute()方法來啟動服務。而且每一個Bean實際上只是引用同樣的類或對象。
  
  現在需求已經確定而

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩精品专区| 国产精品视频白浆免费视频| 欧美人在线视频| 日韩电影免费观看在线| 欧美巨乳在线观看| 欧美一区二区三区精品电影| 亚洲欧洲免费视频| 久久精品视频播放| 亚洲系列中文字幕| 欧美日韩美女在线观看| 久久久之久亚州精品露出| 中文字幕免费精品一区高清| 日韩欧美国产一区二区| 视频一区视频二区国产精品| 米奇精品一区二区三区在线观看| 欧美性xxxx极品hd欧美风情| 国产成人精品久久二区二区| 5278欧美一区二区三区| 久久亚洲私人国产精品va| 欧美理论电影在线播放| 亚洲第一中文字幕在线观看| 久久综合色88| 日韩成人在线网站| 国产美女被下药99| 亚洲精品福利资源站| 精品久久久精品| 91老司机在线| 日韩在线视频免费观看高清中文| 成人午夜激情免费视频| 91精品久久久久久久久青青| 亚洲国产女人aaa毛片在线| 欧美电影电视剧在线观看| 欧美精品videossex88| 中文国产成人精品久久一| 91亚洲精品久久久| 91国产美女在线观看| 91精品久久久久久久久久久久久久| 亚洲裸体xxxx| 久久人人爽人人爽人人片av高清| 欧美一级视频在线观看| 日韩精品在线视频| 欧美精品videossex88| 九九精品视频在线观看| 色噜噜亚洲精品中文字幕| 亚洲自拍小视频| 国产精品亚洲自拍| 国产精品私拍pans大尺度在线| 奇米4444一区二区三区| 国产欧美精品日韩精品| 久99九色视频在线观看| 一区二区三欧美| 久热在线中文字幕色999舞| 日韩经典第一页| 久久久久久免费精品| 深夜福利一区二区| 成人黄色片网站| 欧美重口另类videos人妖| 91爱爱小视频k| 欧美伦理91i| 国产日韩欧美中文| 成人黄色av网站| 欧美精品在线观看| 中文字幕日韩欧美| 日本精品在线视频| 一区二区三区精品99久久| 成人在线视频福利| 在线日韩第一页| 91亚洲精品一区二区| 在线视频欧美日韩精品| 亚洲精品国产拍免费91在线| 亚洲理论电影网| 日本三级久久久| 久久综合电影一区| 亚洲天堂免费视频| 欧美在线视频一区| 久久精品亚洲热| 亚洲欧美国产精品专区久久| 国产精品久久精品| 国产97在线|日韩| 福利视频导航一区| 伊人久久男人天堂| 久久91精品国产91久久跳| 久99久在线视频| 美女久久久久久久久久久| 国产成人avxxxxx在线看| 亚洲日韩中文字幕| 精品一区二区电影| 亚洲片国产一区一级在线观看| 欧美日韩性视频在线| 欧美成人午夜剧场免费观看| xvideos亚洲| 精品久久久久久久久久ntr影视| 国内偷自视频区视频综合| 亚洲美腿欧美激情另类| 日韩欧美中文在线| 日本精品一区二区三区在线播放视频| 国产97在线视频| 亚洲美女性生活视频| 日韩风俗一区 二区| 久99九色视频在线观看| 亚洲国产精品电影在线观看| 欧美中文在线视频| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩中国免费专区在线看| 亚洲精品国产精品国自产观看浪潮| 免费成人高清视频| 欧美黑人狂野猛交老妇| 国产午夜一区二区| 伊人久久久久久久久久| 91久久综合亚洲鲁鲁五月天| 亚洲精品日产aⅴ| 成人欧美一区二区三区在线湿哒哒| 亚洲免费av网址| 精品久久久久久亚洲精品| 欧美精品18videosex性欧美| 久久九九有精品国产23| 美女av一区二区三区| 亚洲国产精品va| 欧美尺度大的性做爰视频| 国产va免费精品高清在线观看| 国色天香2019中文字幕在线观看| 日韩在线免费高清视频| 青青草原成人在线视频| 中文字幕日韩专区| 久久最新资源网| 一区二区福利视频| 欧美裸体视频网站| 久久久久久久久网站| 亚洲三级av在线| 国产精品女主播| 成人h视频在线观看播放| 日韩在线观看电影| 久久激情视频免费观看| 国产亚洲欧美aaaa| 国产丝袜一区二区三区免费视频| 91久久久国产精品| 国产精品jizz在线观看麻豆| 久久青草福利网站| 欧美精品国产精品日韩精品| 欧美精品激情blacked18| 欧美性受xxxx白人性爽| 欧美激情一区二区久久久| 国产一区二区日韩| 亚洲天堂影视av| 57pao国产成人免费| 久久久久国产视频| 久久成人国产精品| 欧美日韩国产在线| 欧美洲成人男女午夜视频| 正在播放国产一区| 在线日韩日本国产亚洲| 亚洲最大福利视频网| 日韩欧美国产网站| 国内外成人免费激情在线视频网站| 亚洲综合第一页| 欧美日韩一区二区在线| 538国产精品视频一区二区| 国产美女久久久| 日韩欧美国产激情| 亚洲丁香久久久| 亚洲va欧美va国产综合久久| 在线日韩精品视频| 欧美日韩一区二区免费在线观看| 国产午夜一区二区|