sTodo 的插件机制
sTodo 的插件机制是对 javax.script 做的一个浅包装。插件在物理上是一个脚本文件,sTodo 的 Java 端代码公开一些对象供 JavaScript 访问,比如菜单栏,这样 JavaScript 代码则可以创建新的菜单,提供新的功能给 Java。同样的,在 JavaScript 端,公开一个 入口,供 Java 端的代码调用。
图 sTodo 插件机制结构图 插件具有状态,并被安装在插件管理器中,可以被激活。sTodo 的生命周期中,有一个单 例的插件管理器,可以在一个模块内安装插件,并在另外一个模块中使用,为了保证访问插 件的时刻必须在安装之后,我们可以在软件初始化的时候将依赖关系调整好,然后将异步的 响应动作放到 UI 组件的监听器上。 我们来详细查看一下 sTodo 的工作机制: 在 sTodo 的初始化中:
public void initEnv(){
PluginManager pManager = TodoPluginManager.getInstance();
Plugin system =
new TodoPlugin("scripts/system.js", "system", "system
initialize"); pManager.install(system);
}
我们会安装一个 system.js 的插件,这个插件的功能是初始化脚本环境,加载其他插件(也 就是脚本)。然后在 main 方法中:
public static void main(String[] args){
STodo sTodo = new STodo(new MainFrame("My todo list"));
sTodo.initEnv();
Plugin system =
TodoPluginManager.getInstance().getPlugin("system");
system.putValueToContext("Application", sTodo);
system.putValueToContext("DataModel", new DataModel());
system.putValueToContext("Util", new Util());
system.execute("main", new Object());
}
将一些公用的组件暴露给脚本环境,如 Application,DataModel,Util 等,以便脚本环境 可以直接访问 Java 端的 swing 组件及数据模型。最后,执行 system.execute。也就是 执行 main 函数,这个 main 函数定义在插件 system 中。 最后,还有一个方法用以启动 sTodo 的 Java 端:
public void launch(){
SwingUtilities.invokeLater(new Runnable(){
public void run() {
mainFrame.initUI();
}
});
}
这个方法通过 JavaScript 端(system 插件对应的脚本)来完成。流程是这样:Java 端执行 main 方法,初始化环境,加载脚本,然后想底层的引擎中放入公有对象(Application 等), 然后调用JavaScript端的main函数,JavaScript端开始初始化其自身的环境,与共有对象交互,最后反过来调用 Java 端的 launch 启动 UI。
{$ activeFileHint $}