想了解更多,猛击[url]http://nutzhome.appspot.com/[/url]

原创者: zozoh [url]http://zozoh.iteye.com/[/url]

什么是插件

如果我们的项目依赖了一个接口,但是我们在开发时,真的没办法确定,部署的时候,到底采用哪个实现。

比如 Nutz.Log。 它在运行时,会判读当前运行环境 log4j 是否可用(有 log4j 的类,以及有 log4j 的配置文件),如果没有,它就检测 java.util.logging 是否可以用(有有效的配置文件),如果还没有,那么它就把日志信息输出到控制台上。它的实现,就是依靠的方式。

但是,同复杂强大的 OSGI 插件体系不同,这里的插件只是强调,在部署时决定采用什么实现。在运行时,它是没办法更改的。因此 Nutz 虽然在编译时依赖了 Log4j,但是在运行时,没有 log4j 的 jar,依然能够工作的很好。

也正因为,这个插件简单的令人发指。有兴趣的同学可以参看:
[url]http://code.google.com/p/nutz/source/browse/#svn/trunk/src/org/nutz/plugin[/url] 里面的源代码,我想几分钟你就会全部看完。
--------------------------------------------------------------------------------------------------------
简单使用插件
比如有一个接口:

   public interface Said{        String say(); }

你有两个实现类:
* 实现类 A

       public class TomSaid implements Said{         public String say(){              return "I am Tom";          }     }

* 实现类 B

       public class PeterSaid implements Said{           public String say(){              return "I am Peter";            }     }

这两个实现类分别放在两个 jar 包里,在你的工程部署时,负责部署的工程师很希望:
* 将 tom.jar 放到项目里,整个工程就会使用 TomSaid,
* 将 peter.jar 放到项目,整个工程就会使用 PeterSaid,
* 将两个 jar 都放到项目,PeterSaid 有更高的优先级

{#A31;*怎样做到这一点呢?}

首先我们需要在你的工程里为 TomSaid 实现一个插件:

   public class TomSaidPlugin implements Plugin, Said{       private Said said;        public boolean canWork(){         try {             said = (Said)(Class.forName("com.you.app.TomSaid").newInstance());             return true;          } catch (Exception e) {}          return false;     }     public String say(){          return said.say();        } }

同理,为 PeterSaid 也实现一个插件:

   public class PeterSaidPlugin implements Plugin, Said{     private Said said;        public boolean canWork(){         try {             said = (Said)(Class.forName("com.you.app.PeterSaid").newInstance());               return true;          } catch (Exception e) {}          return false;     }     public String say(){          return said.say();        } }

在调用代码里这样实现:

   PluginManager<Said> plugins = new SimplePluginManager<Said>(         "com.you.app.PeterSaidPlugin",          "com.you.app.TomSaidPlugin");   Said said = plugins.get();   System.out.println(said.say());

上面的代码既不依赖 PeterSaid,也不依赖 TomSaid,完全能满足部署工程师的要求。

采用 SimplePluginManager 有几个注意事项:
* 插件实现类必须有一个默认的构造函数
* 插件实现类必须实现目标接口,在上例中就是 Said 接口
* 插件实现类实际上就是一个被适配目标的一个代理 (在这里,你可以套套“代理模式”)
* 构造函数参数的顺序,就是插件的优先级,第一个最优先

--------------------------------------------------------------------------------------------------------

最后一点说明
我曾一度怀疑这个插件功能很无聊,因为它真的可以用“简陋”二字来形容(我们实现这个插件用的时间还没有我写这篇文档所用时间的一半),但是它毕竟给了你一条很简明的途径,让你的程序可以做到:

[color=red]部署时才决定某一个接口的实现[/color]

你用微小的代价(实现一个接口函数)获得下面两个好处:
* 你的应用很容易做到 [color=red]模块化[/color]
* 它几乎 [color=red]没有侵入性[/color]
挺值得的,不是吗? 这也是为什么我们将它放到 Nutz 的核心发布包里原因:
({/超值的东西才会被放到 Nutz 的核心包里})

如果你想做到运行时加载/卸载,这个“简陋”的小插件方案恐怕是帮不上你了。但是你真的需要吗?
我注意到一个事实:Eclipse 采用的是 “OSGI”,但是在安装了一个插件之后它还是会建议你重启应用,每次我看到这个对话框,都觉得是对 “OSGI” 的一个讽刺。

Nutz寻宝: 万能充电器-Nutz.Plugin相关推荐

  1. b丅151组成的充电器电路_手机万能充电器电路原理与维修

    手机万能充电器电路原理与维修 由于各型号手机所附带的充电器插口不同, 以造成各手机充电器之间不能通 用. 当用户手机充电器损坏或丢失后, 无法修复或购不到同型号充电器, 使手机 无法使用. 万能充电器 ...

  2. 手机万能充电器电路原理与维修

    手机万能充电器电路原理与维修 由于各型号手机所附带的充电器插口不同,以造成各手机充电器之间不能通用.当用户手机充电器损坏或丢失后,无法修复或购不到同型号充电器,使手机无法使用.万能充电器厂家看到这样的 ...

  3. 万能充电器工作原理_百度知道

    万能充电器工作原理_百度知道 万能充电器工作原理_百度知道 万能充电器工作原理     2008-08-29 21:27 457070320 | 分类:社会民生 | 浏览4372次 | 该问题已经合并 ...

  4. nutz mysql druid_SpringBoot+Druid+Nutz+Jasypt整合配置多数据源

    一 .    引入依赖 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org. ...

  5. nutz oracle配置,关于Nutz无法连接oracle的问题

    大家好,我参考Nutz-book项目之后想要把数据库从**mysql**改为**oracle**,但是项目启动不起来,提示*ERROR - dataSource init error* 我的**dao ...

  6. nutz如何处理ajax请求,nutz重定向请求问题

    这是jjava代码 @At @Ok("jsp:website.schoolmanagement") public void SchoolmanagementSvw() { } 这是 ...

  7. nutz mysql druid_在Nutz中给Druid配置数据库加密

    dao.js代码片段 dataSource : { type : "com.alibaba.druid.pool.DruidDataSource", events : { crea ...

  8. Java高效开发框架Nutz:是SSH的轮子?还是新神器?

    摘要: Nutz是一个优秀的国产开源项目,它是一组轻便小型的框架的集合,被称作是"除了SSH之外的另一个选择".CSDN记者此次采访了Nutz开发者社区中的几位主要开发者,请他们来 ...

  9. nutz oracle配置,nutz的框架NutzDao-自定义SQL

    1.普通的自定义SQL语句 在Nutz中通过org.nutz.dao.sql.Sql接口的实现类org.nutz.dao.Sqls来创建自定义SQL语句.代码如下: Sql sql =Sqls.cre ...

最新文章

  1. uboot添加自定义命令
  2. git touch不是内部_'NODE_ENV' 不是内部或外部命令,也不是可运行的程序或批处理文件。...
  3. 进程和线程的基本概念
  4. (收藏)Html相关网址
  5. std::string与MFC的CString的比较
  6. 花51万请明星和网红带货仅卖5000元,法院这样判了...
  7. java 分级显示_上级部门与下级部门的分类显示
  8. python是什么软件-python一般用什么软件
  9. 【论文笔记】中文词向量论文综述(二)
  10. unity零基础学习
  11. 解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类
  12. python mp4提取音频_Python从视频文件中提取wav
  13. vtuber面部捕捉工具_NOKOV(度量)动作捕捉携专业虚拟直播解决方案亮相世界VR产业大会...
  14. C++ 类(继承中的构造和析构)
  15. 关于glew.h / glut.h引用
  16. SR触发器和JK触发器
  17. 最新怀旧服服务器人口比例,魔兽世界怀旧服人口普查1月 2021年人口比例数据查询...
  18. 洛谷3月月赛 R1 Step! ZERO to ONE
  19. 整个部门就一个研发?
  20. 1. 大型网站架构演化

热门文章

  1. (实用)页面在线QQ咨询html代码
  2. 计算机网络安全清华大学出版答案,计算机网络安全清华大学出版答案
  3. SED与AWK命令攻略大全
  4. AMD黑苹果万能显卡驱动
  5. latex中文加粗失效(楷体)
  6. Ubuntu18.04下VScode调试方法
  7. 书单(含资源链接,快撸!)
  8. 计算机毕设Python+Vue政府机关门禁管理系统(程序+LW+部署)
  9. php 屏蔽微信分享,微信sdk实现禁止微信分享(使用原生php实现)
  10. Push rejected Push master to origin/master was rejected by remote