<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zcx

    Java ClassLoader 實(shí)現(xiàn)程序的擴(kuò)展性

      

    今天在完成一個(gè)功能的時(shí)候,使用了ServiceLocate模式,

    過這個(gè)模式,在程序中可以自由的加其他成員實(shí)現(xiàn)的功能模

    具體的做法:

     1)定義標(biāo)準(zhǔn)的服務(wù)接口。

     2)定描述實(shí)現(xiàn)務(wù)接口的xml文件。

     3)程序xml文件,使用Class.newInstance()實(shí)例化具體的服務(wù)對(duì)象。

     4)建立一個(gè)特定服務(wù)和特定服務(wù)實(shí)現(xiàn)對(duì)應(yīng)HashMap對(duì)象。完成注冊(cè)任務(wù)

     5)主程序中根據(jù)具體的服務(wù)HashMap中取得具體的對(duì)進(jìn)行服務(wù)

     

    個(gè)方法錯(cuò),可以完成基于Interface開發(fā)要求,利于Test和程序的拓展性。

    有新的要求出現(xiàn)后,只需要添加xml中的元素和具體的實(shí)現(xiàn)類就可以了。

     

    接下來,繼續(xù)想。又發(fā)現(xiàn)問題

    1xml是和程序一起發(fā)布的,如果用隨意改動(dòng)了。很明程序會(huì)崩

    解決方法:xml放在jar包中,使用getClass().getResourceAsStream(String name)

    自己加載進(jìn)來。用完全不知道具體的情況。

     

    2)如果把xml放在了jar包中“藏起來”,實(shí)際上原來來的動(dòng)態(tài)擴(kuò)展的特性,

    也就沒有那了。如何解決呢

     

    細(xì)細(xì)想來,個(gè)問題關(guān)鍵在于,所有的服務(wù)實(shí)對(duì)象的創(chuàng)建和注冊(cè)都是在

    主控程序中通xml來完成的。如果可以把個(gè)注冊(cè)和實(shí)例化的程從主控程序

    中分離出來,通過每個(gè)服務(wù)實(shí)對(duì)象自動(dòng)注冊(cè)來完成,那算是真正的可拓展的。

    如果需要完成新的功能,只需要把新的服務(wù)對(duì)Class發(fā)布,重新運(yùn)行主控程序就會(huì)實(shí)現(xiàn)的功能。(看起來就和Eclipse

    真是一個(gè)不錯(cuò)的想法,但是怎做呢?

     

    看看Eclipse如何做的。

    http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

     

     

    首先要有一個(gè)規(guī)定的plugin deploy這樣主程序才知道從哪里加

    要有一個(gè)plugin.xml文件描述個(gè)plugin.著文件中有屬性:class="foo.bar.Plugin">

    看上去和我原來做的方式一啊。但是它是如何把個(gè)目下的plugin都加的呢?

    我沒有看Eclipse的源,不知道他是怎寫的)

     

    再想想,其實(shí)主要要解決的問題是不通主框架程序注冊(cè)服務(wù)實(shí)現(xiàn)

    應(yīng)該由服務(wù)程序自己注冊(cè)上來。按照個(gè)思路,我想有兩解決方案。

    1)服務(wù)接口添加registerService 方法。

       * jarMETATINFO文件中定義類名。

       * 從特定的目jar/class文件。

       * URLClassLoader.newInstance()

       * 后把ServiceLoader參數(shù)出入 service.registerSevice()

       * service對(duì)象完成自己的注冊(cè)。

    2)服務(wù)添加static端在實(shí)例化的時(shí)候自動(dòng)完成注冊(cè)。

       * 之前和上一個(gè)方法一

       * 對(duì)SeviceLoader對(duì)實(shí)現(xiàn)為單態(tài)的模式。提供靜態(tài)的注冊(cè)方法。

       * servie對(duì)象中實(shí)現(xiàn)如下的代段完成自動(dòng)注冊(cè)。

       static

                  {

                    ServiceLoader.registerService(new service());

                  }

     

     

    這樣看來總算OK了吧。

    posted on 2005-01-11 18:00 zcx 閱讀(658) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 亚洲一级黄色视频| 国产公开免费人成视频| 国产亚洲福利精品一区| 思思久久99热免费精品6| 亚洲国产高清视频在线观看| 国产免费伦精品一区二区三区| 免费夜色污私人影院在线观看| 男女啪啪免费体验区| 亚洲国产成人久久一区WWW| 午夜免费国产体验区免费的| 亚洲午夜AV无码专区在线播放 | 两个人日本WWW免费版| 久久不见久久见免费影院| 亚洲午夜国产精品| 成年女人毛片免费播放人| 亚洲啪AV永久无码精品放毛片| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲欧洲无码一区二区三区| 操美女视频免费网站| 怡红院亚洲红怡院在线观看| 一区国严二区亚洲三区| 和老外3p爽粗大免费视频| 亚洲Av无码精品色午夜| 亚洲国产精品免费观看| 在线亚洲v日韩v| 亚洲日韩aⅴ在线视频| 一级毛片免费毛片一级毛片免费| 亚洲妓女综合网99| 国产真实伦在线视频免费观看| 一个人免费观看视频在线中文| 亚洲AV中文无码字幕色三| 真人做人试看60分钟免费视频| 亚洲人成色99999在线观看| 久久久久国产亚洲AV麻豆 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲一区二区三区四区视频| 啊灬啊灬别停啊灬用力啊免费看| 国内精品一级毛片免费看| 亚洲精品亚洲人成在线播放| 亚洲国产V高清在线观看| 精品免费久久久久久久|