`
wendal
  • 浏览: 21353 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Nutz寻宝: 万能充电器-Nutz.Plugin

    博客分类:
  • Nutz
阅读更多
想了解更多,猛击http://nutzhome.appspot.com/

原创者: zozoh http://zozoh.iteye.com/

什么是插件

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

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

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

也正因为,这个插件简单的令人发指。有兴趣的同学可以参看:
http://code.google.com/p/nutz/source/browse/#svn/trunk/src/org/nutz/plugin 里面的源代码,我想几分钟你就会全部看完。
--------------------------------------------------------------------------------------------------------
简单使用插件
比如有一个接口:
	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 接口
* 插件实现类实际上就是一个被适配目标的一个代理 (在这里,你可以套套“代理模式”)
* 构造函数参数的顺序,就是插件的优先级,第一个最优先

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

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

部署时才决定某一个接口的实现

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

如果你想做到运行时加载/卸载,这个“简陋”的小插件方案恐怕是帮不上你了。但是你真的需要吗?
我注意到一个事实:Eclipse 采用的是 “OSGI”,但是在安装了一个插件之后它还是会建议你重启应用,每次我看到这个对话框,都觉得是对 “OSGI” 的一个讽刺。
分享到:
评论
5 楼 ferreousbox 2011-02-21  
这种插件模式还不如用java自己的service查找模式,慢是慢一点,但启动时查找不见得是坏事,而且完全是基于接口的,简单方便
4 楼 ferreousbox 2011-02-21  
没太觉得这种实现有什么好,这个所谓的插件必须是预知的。而一般的插件定义应该是未知但可用的
3 楼 zozoh 2010-01-11  
没有插件的实现,就实现一个呗 
2 楼 wendal 2010-01-11  
nwangwei 写道
这个处理办法,如果预先没有插件的实现怎么办呢?
因为
PluginManager<Said> plugins = new SimplePluginManager<Said>(   
        "com.you.app.PeterSaidPlugin",   
        "com.you.app.TomSaidPlugin");   
Said said = plugins.get();   
System.out.println(said.say());   

里面要写上已有的实现哦。

那就要有约定或者配置才行了,呵呵


如果连就简单的Plugin接口都不实现,那你干脆直接写:

for (String className : names)
    try {
         return Class.forName(className).newInstance()
    } catch (Throwable e) {}

这样的话, 你也无须使用Nutz这套插件机制了.
毕竟, 不实现Plugin接口, SimplePluginManager也无从知道该插件是否可用.
1 楼 nwangwei 2010-01-10  
这个处理办法,如果预先没有插件的实现怎么办呢?
因为
PluginManager<Said> plugins = new SimplePluginManager<Said>(   
        "com.you.app.PeterSaidPlugin",   
        "com.you.app.TomSaidPlugin");   
Said said = plugins.get();   
System.out.println(said.say());   

里面要写上已有的实现哦。

那就要有约定或者配置才行了,呵呵

相关推荐

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.b.43-jdk6.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.49-manual.pdf

    标题:"nutz-1.b.49-manual.pdf" 指出了文档是关于Nutz框架的官方手册,版本为1.b.49。手册这一名称通常意味着该文档是为用户提供详细的指导,帮助用户理解和使用该框架。 描述:"nutz 框架nutz-1.b.49-manual.pdf...

    nutz-1.r.62.zip

    Nutz-1.r.62是该框架的一个版本,它包含了一系列优化和改进,使得开发者在构建应用程序时能更加得心应手。 在Nutz-1.r.62.zip压缩包中,主要有以下几个文件: 1. `nutz-1.r.62.jar`:这是Nutz框架的核心库文件,...

    nutz-1.b.48-manual.pdf 文档

    Nutz的设计目的之一是解决Java在Web开发领域相对于脚本语言而言显得开发效率较低的问题,通过提供一整套简洁、高效的组件和工具,如Dao、Ioc、Mvc、Json、Castors、Lang、Aop、Plugin和Resource,它们独立使用且功能...

    nutz-1.r.61.r2.jar包

    标题中的"nutz-1.r.61.r2.jar"是一个特定版本的Nutz框架的Java库文件。Nutz是一个开源的Java框架,它旨在简化Web开发,提供一系列实用工具和强大的支持,使得开发者能够更高效地进行业务逻辑处理。这个版本号"1.r.61...

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    nutz-1.r.58

    "nutz-1.r.58"是一个特定版本的Nutz框架发布包,包含了该框架的各种组件和文档,便于开发者在项目中使用和学习。 在提供的文件列表中,我们有以下内容: 1. `nutz-1.r.58-javadoc.jar`:这是Nutz框架的API文档,...

    nutz-1.r.61-发布包

    "nutz-1.r.61-发布包"是Nutz框架的一个版本更新,具体为1.r.61版本。这个发布包包含了该版本的文档、源代码、编译后的类库以及相关的辅助文件,便于开发者下载、学习和使用。 1. **Nutz框架概述** Nutz 是一个轻量...

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    Json 解析器 -- Nutz.Json 更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的是在第一版,我还是...

    nutz-1.r.57的JDK1.5编译

    在本案例中,我们关注的是"Nutz-1.r.57的JDK1.5编译",这表明我们需要了解如何在较低的JDK版本环境下,编译和使用Nutz框架。 首先,我们要知道Nutz官方推荐使用JDK1.6进行编译,这是因为JDK1.6引入了许多对开发者...

    nutz-1.b.52.zip

    如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计 如果你觉得 JSON 转换很麻烦(要写超过一行以上的代码),Nutz.Json 专为你设计 如果你觉得 Java 语法不如 Ruby 便捷, Nutz....

    nutz需要的jar包

    在进行Web开发时,我们还需要`nutz-plugin-shiro`,这是一个基于Apache Shiro的安全插件,提供了认证、授权、会话管理和密码加密等功能,保障应用的安全性。此外,`nutz-ioc`和`nutz-aop`分别提供了依赖注入和面向切...

    nutuz-1.b.52.r3.zip

    5. `nutz-1.b.52-manual.pdf` 和 `nutz-1.b.52-manual.rtf`:这两个文件都是 Nutz 框架的手册,分别提供了 PDF 和 RTF 格式,涵盖了框架的使用指南和教程,帮助开发者快速上手。 6. `manual`:这个文件名可能是一个...

    nutz-1.b.49.r2.zip

    Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

    nutz-1.r.65.zip

    nutzboot1.65版jar包...............................................................................................希望对你有用

    wendal-nutz-master.zip

    这个压缩包“wendal-nutz-master.zip”包含了NUTZ框架的一个示例项目或者学习资源,帮助初学者理解和掌握NUTZ的核心特性。 在深入探讨NUTZ之前,我们先来理解一下什么是框架。框架是一种预定义的软件结构,它规定了...

Global site tag (gtag.js) - Google Analytics