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 閱讀(662) 評論(0)  編輯  收藏

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


          網站導航:
           
           
          主站蜘蛛池模板: 济南市| 宁陵县| 潞城市| 丰顺县| 黔西县| 清流县| 博乐市| 无锡市| 永仁县| 宜都市| 阿瓦提县| 鲁山县| 隆德县| 文水县| 宁津县| 永寿县| 开江县| 科尔| 留坝县| 徐水县| 长治市| 任丘市| 凉城县| 卓资县| 冀州市| 宁波市| 调兵山市| 鲜城| 贞丰县| 北宁市| 高碑店市| 甘孜县| 宣城市| 工布江达县| 峨山| 舞阳县| 静海县| 阳东县| 北辰区| 和龙市| 凌源市|