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 阅读(646) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: