簡介:
jspf (Java Simple Plugin Framework) 是一個插件框架,用於減小小型項目的的開發時間,增長代碼的可維護性。他徹底隱藏了組件的詳細實現,只用到他們的接口。加載組件所須要的代碼也不多,便於編寫。
jspf框架徹底基於java註釋實現
@PluginImplementation,@InjectPlugin,@PluginLoaded,@Timer
和@Thread等.
(關於java註釋:元數據從metadata一詞譯來,就是「關於數據的數據」的意思。愈來愈的開源框架都提供了「元數據」支持,其實也就是註釋支持。Annotation是從java5開始在語言級別提供的一項新特性,Annotation提供了一條與程
序元素關聯任何信息或者任何元數據(metadata)的途徑。從某些方面看,annotation就像修飾符同樣被使用,並應用於包、類型、構造方法、方法、成員變量、參數、本地變量的聲明中。這些信息被存儲在annotation的「name=value」結構對中。annotation類型是一種接口,可以經過java反射API的方式提供對其信息的訪問。)
支持:從JAR文件加載插件,從一個目錄加載多個插件,自動加載classpath中全部的插件,經過HTTP加載插件。線程安全。類型安全。支持緩存。插件能夠使用一個單獨的ClassLoader進行能夠分離。
相應接口說明
PluginManager pm=PluginManagerFactory.createPluginManager();
pm.addPluginsFrom(new File("myPluginDir/").toURI());
/*PluginManagerFactory類是爲了建立一個新的插件管理中心,這是使用jspf的入口和開始點。*/
public void addPluginsFrom(URI url, AddPluginsFromOption... options);
(@param1 url就是指加載插件的路徑
@param2 忽略不使用)
/*插件管理器從指定路徑加載一個插件,這個路徑能夠是文件夾下的zip文件,jar文件,也能夠是類文件。插件管理器將尋找含有@PluginImplementation 註釋的類(classes),而且根據這個註釋來初始化插件*/
addPluginsFrom(new URI("classpath://*"))
加載全部插件在當前的類路徑
addPluginsFrom(new File("plugins/").toURI())
加載全部指定路徑內的插件
addPluginsFrom(new File("plugin.jar").toURI())
加載一個jar格式的插件
addPluginsFrom(new URI("http://sample.com/plugin.jar"))
從網絡路徑上下載而且加載插件
addPluginsFrom(new ClassURI(ServiceImpl.class).toURI())
直接加載一個插件實現的類文件
public <P extends Plugin> P getPlugin(Class<P> plugin, GetPluginOption... options);
(@param1 plugin就是指插件的類文件,如plugin1.class....
@param2 忽略不使用)
如何使用:
經過http://code.google.com/p/jspf/downloads/list
下載文件,在java工程中導入jspf.core-1.0.0.jar,仿照下面介紹的簡單例子就能夠實現一個簡單的插件管理程序。
代碼示例:利用jspf框架加載兩個插件的實現
1. 建立一個java接口文件CoolPlugin,代碼以下:
package coolplugin;
import net.xeoh.plugins.base.Plugin;
public interface CoolPlugin extends Plugin
{
public String sayCool();
}
(extends Plugin其中Plugin是jspf.core-1.0.0.jar中package net.xeoh.plugins.base中提供的public interface Plugin)
建立一個java類文件,CoolPluginImpl,代碼以下:
package impl;
import coolplugin.CoolPlugin;
import net.xeoh.plugins.base.annotations.PluginImplementation;
@PluginImplementation
public class CoolPluginImpl implements CoolPlugin
{
public String sayCool()
{
return "Hello!Cool!";
}
}
(上述插件接口的實現@PluginImplementation不可少)
這樣就完成了第一個Cool插件的編寫
2. 建立一個java接口文件HotPlugin,代碼以下:
package hotplugin;
import net.xeoh.plugins.base.Plugin;
public interface HotPlugin extends Plugin
{
public String sayHot();
}
建立一個java類文件,HotPluginImpl,代碼以下:
package impl;
import hotplugin.HotPlugin;
import net.xeoh.plugins.base.annotations.PluginImplementation;
@PluginImplementation
public class HotPluginImpl implements HotPlugin
{
public String sayHot()
{
return "Hello!Hot!";
}
}
這樣就完成了第二個Hot插件的編寫
3.編寫插件管理中心main,代碼以下
public static void main(String[] args) throws MalformedURLException
{
PluginManager pm = PluginManagerFactory.createPluginManager();
/*load classpath*/
pm.addPluginsFrom(new File("bin/").toURI());
CoolPlugin plugin1 = pm.getPlugin(CoolPlugin.class);
System.out.println(plugin1.sayCool());
HotPlugin plugin2 = pm.getPlugin(HotPlugin.class);
System.out.println(plugin2.sayHot());
}
運行後獲得的結果是
"Hello!Cool!"
"Hello!Hot!"
利用"addPluginsFrom("...",new OptionReportAfter());"監視方法,能夠得到詳細信息:
Class Report <<<
****.CoolPluginImpl (status:'SPAWNED'; dependencies:''; origin:'file:*****;)
****.HotPluginImpl (status:'SPAWNED'; dependencies:''; origin:'file****/';)
>>> Object Report <<<
****.CoolPluginImpl @162db76 (status:'ACTIVE')
****.HotPluginImpl @21a14e (status:'ACTIVE')
說明兩個插件加載成功