Nutz寻宝: 万能充电器-Nutz.Plugin
想了解更多,猛击[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相关推荐
- b丅151组成的充电器电路_手机万能充电器电路原理与维修
手机万能充电器电路原理与维修 由于各型号手机所附带的充电器插口不同, 以造成各手机充电器之间不能通 用. 当用户手机充电器损坏或丢失后, 无法修复或购不到同型号充电器, 使手机 无法使用. 万能充电器 ...
- 手机万能充电器电路原理与维修
手机万能充电器电路原理与维修 由于各型号手机所附带的充电器插口不同,以造成各手机充电器之间不能通用.当用户手机充电器损坏或丢失后,无法修复或购不到同型号充电器,使手机无法使用.万能充电器厂家看到这样的 ...
- 万能充电器工作原理_百度知道
万能充电器工作原理_百度知道 万能充电器工作原理_百度知道 万能充电器工作原理 2008-08-29 21:27 457070320 | 分类:社会民生 | 浏览4372次 | 该问题已经合并 ...
- nutz mysql druid_SpringBoot+Druid+Nutz+Jasypt整合配置多数据源
一 . 引入依赖 org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org. ...
- nutz oracle配置,关于Nutz无法连接oracle的问题
大家好,我参考Nutz-book项目之后想要把数据库从**mysql**改为**oracle**,但是项目启动不起来,提示*ERROR - dataSource init error* 我的**dao ...
- nutz如何处理ajax请求,nutz重定向请求问题
这是jjava代码 @At @Ok("jsp:website.schoolmanagement") public void SchoolmanagementSvw() { } 这是 ...
- nutz mysql druid_在Nutz中给Druid配置数据库加密
dao.js代码片段 dataSource : { type : "com.alibaba.druid.pool.DruidDataSource", events : { crea ...
- Java高效开发框架Nutz:是SSH的轮子?还是新神器?
摘要: Nutz是一个优秀的国产开源项目,它是一组轻便小型的框架的集合,被称作是"除了SSH之外的另一个选择".CSDN记者此次采访了Nutz开发者社区中的几位主要开发者,请他们来 ...
- nutz oracle配置,nutz的框架NutzDao-自定义SQL
1.普通的自定义SQL语句 在Nutz中通过org.nutz.dao.sql.Sql接口的实现类org.nutz.dao.Sqls来创建自定义SQL语句.代码如下: Sql sql =Sqls.cre ...
最新文章
- uboot添加自定义命令
- git touch不是内部_'NODE_ENV' 不是内部或外部命令,也不是可运行的程序或批处理文件。...
- 进程和线程的基本概念
- (收藏)Html相关网址
- std::string与MFC的CString的比较
- 花51万请明星和网红带货仅卖5000元,法院这样判了...
- java 分级显示_上级部门与下级部门的分类显示
- python是什么软件-python一般用什么软件
- 【论文笔记】中文词向量论文综述(二)
- unity零基础学习
- 解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类
- python mp4提取音频_Python从视频文件中提取wav
- vtuber面部捕捉工具_NOKOV(度量)动作捕捉携专业虚拟直播解决方案亮相世界VR产业大会...
- C++ 类(继承中的构造和析构)
- 关于glew.h / glut.h引用
- SR触发器和JK触发器
- 最新怀旧服服务器人口比例,魔兽世界怀旧服人口普查1月 2021年人口比例数据查询...
- 洛谷3月月赛 R1 Step! ZERO to ONE
- 整个部门就一个研发?
- 1. 大型网站架构演化
热门文章
- (实用)页面在线QQ咨询html代码
- 计算机网络安全清华大学出版答案,计算机网络安全清华大学出版答案
- SED与AWK命令攻略大全
- AMD黑苹果万能显卡驱动
- latex中文加粗失效(楷体)
- Ubuntu18.04下VScode调试方法
- 书单(含资源链接,快撸!)
- 计算机毕设Python+Vue政府机关门禁管理系统(程序+LW+部署)
- php 屏蔽微信分享,微信sdk实现禁止微信分享(使用原生php实现)
- Push rejected Push master to origin/master was rejected by remote