zcx

          Java ClassLoader 實現程序的擴展性

            

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

          過這個模式,在程序中可以自由的加其他成員實現的功能模

          具體的做法:

           1)定義標準的服接口。

           2)定描述實現接口的xml文件。

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

           4)建立一個特定服和特定服務實現對應HashMap象。完成注冊任。

           5)主程序中根據具體的服HashMap中取得具體的行服

           

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

          有新的要求出后,只需要添加xml中的元素和具體的實現類就可以了。

           

          接下來,繼續想。又發現問題

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

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

          自己加載進來。用完全不知道具體的情況。

           

          2)如果把xml放在了jar包中“藏起來”,實際上原來來的動態擴展的特性,

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

           

          細細想來,問題關鍵在于,所有的服務實象的建和注冊都是在

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

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

          如果需要完成新的功能,只需要把新的服務對Class布,重新運行主控程序就會實現的功能。(看起來就和Eclipse

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

           

          看看Eclipse如何做的。

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

           

           

          首先要有一個定的plugin deploy,這樣主程序才知道從哪里加

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

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

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

           

          再想想,其主要要解決的問題是不通主框架程序注冊服務實現

          應該由服程序自己注冊上來。按照個思路,我想有兩解決方案。

          1)服接口添加registerService 方法。

             * jarMETATINFO文件中定義類名。

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

             * URLClassLoader.newInstance()

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

             * service象完成自己的注冊。

          2)服添加static端在例化的候自完成注冊。

             * 之前和上一個方法一。

             * SeviceLoader實現為單態的模式。提供靜的注冊方法。

             * servie象中實現如下的代段完成自注冊。

             static

                        {

                          ServiceLoader.registerService(new service());

                        }

           

           

          這樣看來總算OK了吧。

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

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


          網站導航:
           
           
          主站蜘蛛池模板: 大英县| 邵阳市| 盐源县| 徐汇区| 静乐县| 萨迦县| 吴川市| 大方县| 灵寿县| 博罗县| 鄢陵县| 乐至县| 台南市| 青河县| 寻甸| 安西县| 凉山| 庄浪县| 丰顺县| 瑞安市| 泰州市| 新和县| 加查县| 怀集县| 彰武县| 勃利县| 望都县| 临潭县| 卢湾区| 白朗县| 本溪市| 仲巴县| 敦化市| 会泽县| 锡林郭勒盟| 鹤岗市| 武宁县| 扶沟县| 西华县| 荣成市| 枣阳市|