以java语言举例来说吧。要想实现插件,基本要符合下面几点要求:
1.宿主系统需要提供对外公开的接口(interface),插件系统创建自己的class,并且要实现公开的interface
2.宿主系统需要动态加载插件,java中可以通过下面的方式来加载并实例化对象
3.为了避免硬编码,宿主系统一般提供一个xml配置文件,把插件相关的信息配置在配置文件中,这样可以根据配置去加载指定的插件,比如:
plugin.xml
<plugins>
<plugin name="plugin1" classname="my.plugin.PluginClass1" />
<plugin name="plugin2" classname="my.plugin.PluginClass2" />
</plugins>
举例来说的话,tomcat相当于一个宿主系统,servlet相当于tomcat下面的插件。
tomcat对外提供javax.servlet.Servlet接口,所有的业务servlet都要implements这个接口(当然servlet规范又为我们提供了一个抽象的HttpServlet类,我们可以extends HttpServlet)。然后业务servlet必须配置在web.xml文件中。tomcat通过读取web.xml中的信息来加载servlet,然后有request请求的时候,根据url mapping去调用指定的业务servlet中的service方法(HttpServlet类为我们实现了service方法,所以我们只需要实现doPost和doGet方法既可,service方法里面会根据request的method类型,来替我们调用doGet或者doPost方法)。
1.宿主系统需要提供对外公开的接口(interface),插件系统创建自己的class,并且要实现公开的interface
public interface PluginClassInterface{
public void play();
public void stop();
}
public PluginClass1 implements PluginClassInterface{
public void play(){
System.out.println("play");
}
public void stop(){
System.out.println("stop");
}
}
2.宿主系统需要动态加载插件,java中可以通过下面的方式来加载并实例化对象
Class clazz = Class.forName("my.plugin.PluginClass1");
PluginClassInterface obj = (PluginClassInterface)clazz.newInstance();
obj.play();
obj.stop();
3.为了避免硬编码,宿主系统一般提供一个xml配置文件,把插件相关的信息配置在配置文件中,这样可以根据配置去加载指定的插件,比如:
plugin.xml
<plugins>
<plugin name="plugin1" classname="my.plugin.PluginClass1" />
<plugin name="plugin2" classname="my.plugin.PluginClass2" />
</plugins>
举例来说的话,tomcat相当于一个宿主系统,servlet相当于tomcat下面的插件。
tomcat对外提供javax.servlet.Servlet接口,所有的业务servlet都要implements这个接口(当然servlet规范又为我们提供了一个抽象的HttpServlet类,我们可以extends HttpServlet)。然后业务servlet必须配置在web.xml文件中。tomcat通过读取web.xml中的信息来加载servlet,然后有request请求的时候,根据url mapping去调用指定的业务servlet中的service方法(HttpServlet类为我们实现了service方法,所以我们只需要实现doPost和doGet方法既可,service方法里面会根据request的method类型,来替我们调用doGet或者doPost方法)。