zcx

          導(dǎo)航

          <2005年1月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345
          統(tǒng)計
          • 隨筆 - 4
          • 文章 - 0
          • 評論 - 3
          • 引用 - 0

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

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

            

          今天在完成一個功能的候,使用了ServiceLocate模式,

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

          具體的做法:

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

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

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

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

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

           

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

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

           

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

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

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

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

           

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

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

           

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

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

          中分離出來,通過每個服務(wù)實(shí)象自注冊來完成,那算是真正的可拓展的。

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

          真是一個不的想法,但是怎做呢?

           

          看看Eclipse如何做的。

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

           

           

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

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

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

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

           

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

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

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

             * jarMETATINFO文件中定義類名。

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

             * URLClassLoader.newInstance()

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

             * service象完成自己的注冊。

          2)服務(wù)添加static端在實(shí)例化的候自完成注冊。

             * 之前和上一個方法一

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

             * servie象中實(shí)現(xiàn)如下的代段完成自注冊。

             static

                        {

                          ServiceLoader.registerService(new service());

                        }

           

           

          這樣看來總算OK了吧。

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

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


          網(wǎng)站導(dǎo)航:
           
           
          主站蜘蛛池模板: 晴隆县| 锡林郭勒盟| 晋宁县| 凯里市| 湖南省| 卓尼县| 肇源县| 邛崃市| 铜梁县| 怀化市| 凤冈县| 即墨市| 诸城市| 长子县| 中西区| 犍为县| 石狮市| 佛学| 泾源县| 武鸣县| 霍邱县| 兰坪| 西华县| 建阳市| 西宁市| 郎溪县| 波密县| 宿迁市| 富蕴县| 浑源县| 合肥市| 枣阳市| 望谟县| 大荔县| 育儿| 昌黎县| 怀宁县| 延吉市| 台山市| 堆龙德庆县| 穆棱市|