jspf插件框架
简介:
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')
说明两个插件加载成功
转载于:https://blog.51cto.com/yaocoder/563347
相关文章:

list控件响应鼠标键的单双击
前面一片博客磁盘文件目录罗列和list控件的使用 写过关于list控件的一点使用方法。这篇博客接着继续讲list控件,当我把某个磁盘下的文件目录列出来显示在list控件中,我们肯定是想要对这些目录进行一些操作,比如新建文件夹、删除文件等操作。那…
我佛了!用KNN实现验证码识别,又 Get 到一招!
作者| 李秋键责编| Carol出品| AI科技大本营(ID:rgznai100)头图 | CSDN付费下载自视觉中国验证码使我们生活中最为常见的防治爬虫和机器人登录攻击的手段,一般的验证码主要由数字和字母组成,故我们可以设想:…

JVM中的垃圾收集器
2019独角兽企业重金招聘Python工程师标准>>> Serial收集器: 一种新生代的单线程收集器,采用复制算法回收。当它进行垃圾收集时,其他用户的所有线程都将暂停。 Serial Old收集器:Serial的老年代版本,采用的是标记-清除算…

linux系统用户,组和权限的管理
PS: {最近一直在做毕业设计,前面博客也记录过我的一些过程。其中需要在Ubuntu上搭建一个FTP服务器,此处我选择Vsftpd,但是在我对vsftpd的配置文件vsftpd.conf设置正确后(对于上传,下载等设置肯定没问题&am…
520 情人节 :属于Python 程序员的脱单攻略大合集(视频版)
作者| Python 编程时光责编| Carol情人节年年有,但今年的 5.20 要比以往的更有意义。2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你我爱你一生一世。为了能过上这个这个百年难遇的情人…

使用Word2010灵活掌握文档结构
使用Microsoft Word应用程序组织和编写文档时,可能会出现反复调整文档结构的情况,而通过一系列的剪切、复制、粘贴操作来解决问题,可能会让您觉得很麻烦,有没有更好的解决办法呢?其实,通过使用Word 2010中全…

深入Jetty源码之HTTP协议
在计算机网络中,如果两台机器要通信,他们首先要定义通信数据的格式,这样在服务器收到客户端的请求消息时,它才能正确的解析请求的内容,然后根据请求内容处理逻辑,并将相应消息传递会客户端;此时…
64位win7安装vs2010出现“组件安装失败...”等问题的解决方法
如题,公司发了新电脑,安装的是64位win7 ,我原来的本本安装的是32位的win7,当时安装vs2010的时候并没有那么多事,这次安装却真是让我蛋疼至极。 先后下了3个vs的安装包,中文版的,有专业版的,有旗…

不同网段路由配置
PC1 ip 192.168.1.1PC2 ip 192.168.4.1路由0 f0/0 192.168.1.254 f0/1 192.168.2.1路由1 f0/0 192.168.3.1f0/1 192.168.2.2路由2 f0/0 192.168.4.254 f0/1 192.168.3.2路由器0Router>enRouter#conf tRouter(config)#no ip domain-lookupRouter(config)#line console 0…
黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!
来源 | 学术头条(ID:SciTouTiao)头图 | CSDN付费下载自视觉中国对于全球 5000 多万盲人来说,重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互,我们发明了盲文,用各种凸起的字符集合来表达各种意思。但这种通过…

Solr 4.x定时、实时增量索引 - 修改、删除和新增索引
2019独角兽企业重金招聘Python工程师标准>>> 一、开始增量索引前的准备工作。 1、认识data-config.xml中相关属性 <!-- transformer 格式转化:HTMLStripTransforme表示 索引中将忽略HTML标签 ---> <!-- query: 查询数据库表符合记录数据 …

关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解
文章写得很详细很清楚了,对我的理解帮助很大。 转载自:http://www.cnblogs.com/whyandinside/archive/2012/03/04/2379234.html。 概括来说,一个IO操作可以分为两个部分:发出请求、结果完成。如果从发出请求到结果返回ÿ…
还在苦恼机器学习和线性回归?这篇总结拿走不谢 | 原力计划
作者 | 听星的朗瑞责编 | 王晓曼出品 | CSDN博客题图 | 东方IC什么是机器学习?机器学习是一种实现人工智能的方法,从数据中寻找规律、建立关系,根据建立的关系去解决问题,从数据中进行经验学习,实现自我优化与升级。维…

网页设计和用户界面设计
摘要:这是两个现在网页设计领域使用频率非常高的词。在大多数情况下,它们被相互替代。这个领域内外的很多人都认为这是两个意义基本一样的词。但是它们真的可以互相混淆么?这是两个现在网页设计领域使用频率非常高的词。在大多数情况下&#…

使用VisualStudio2010连接CodePlex进行代码管理
摘要:CodePlex是微软的开源工程网站,涉及诸多微软最新技术的开源工程,同时你也可以建立并向世界展示自己的开源工程。同SourceForge、GoogleCode相比CodePlex有其自身的优势,特别是对做.Net开发的朋友来说,由于CodePle…

计算程序运行时间(time_t, clock_t)
转载自:http://blog.chinaunix.net/uid-23208702-id-75182.html 计算程序运行时间(time_t, clock_t)-whyliyi-ChinaUnix博客 我们有时需要得到程序的运行时间,但我们也要知道,根本不可能精确测量某一个程序运行的确切…
又一年5.20,用Python助力程序员脱单大攻略(视频版)
作者 | 写代码的明哥来源 | Python编程时光(ID: Cool-Python)情人节年年有,但今年的 5.20 要比以往的更有意义。2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你…

pthred()多线程计算派
实验一:计算π问题描述实验提供了两种计算方法,一种使用积分方法,另一种采用随机数方法。本报告中采用积分方法。计算公式:程序流程图:(图1)函数流程图(图2)一组实验数据,计算规模:500,000,000性…

使用最小堆优化Dijkstra算法
OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点…… 然而正确的实现应该是下面这样的吧,关键在于swap堆中元素时使用pos数组存储改变位置后的编号为k的节点对应在堆中的位置。下面这种…

C语言编程技巧-signal(信号机制)
http://blog.sina.com.cn/s/blog_6a1837e90100v1vc.html

第一课:网络参考模型OSI
网络参考模型OSI(一):模型提出目的:开放系统互连。使各个厂商的设备可以很好的互连、互通、互操作。(二):各层功能(1):物理层:负责链路上bit流的传输。(bit流显著的特点是,不支持格式或者结构)。…
在线直播 | 是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”
几年前曾看过这样一篇报道:Java 之父求职被嫌年纪大,硅谷公司现在喜欢“小鲜肉”,不爱“老古董”。Java之父 James Gosling 在 Facebook 上发表了他所遭遇的年龄歧视:我曾在面试的时候被 HR 告知,“通常我们不招你这种…

eclipse 代码中突然出现特殊字符
在写代码的时候,不知道点到了 eclipse 的哪个属性,代码中就出现了一些特殊字符,也不能删除。 请问,在 eclipse 中该怎么设置,才能将这些字符去掉。 如下图所示: 解决方法: 选择Window->Preferences->…

如何优化数据中心虚拟机布局
当前已经有很多组织将服务器虚拟化技术引入到生产中,这么做是有道理的,特别是在当前经济并不景气的情况下,因为服务器虚拟化技术可以在服务器硬件,机架空间,电力消耗和制冷方面为组织节省开支。 但为了实现服务器虚…

回归——同步更新github.io
回归 已经有好长时间没写博客了,可能我比较懒,不太乐于分享,我觉得这个是一个很不好的习惯。但我坚信:Sharing changes the world! 最近搭建了自己的个人独立博客,基于Github Pages的,所以打算以后同步更…
支持量子机器学习,王海峰发布最新百度飞桨全景图
出品 | AI科技大本营(ID:rgznai100)刚刚,WAVE SUMMIT 2020深度学习开发者峰会上,百度CTO王海峰开场即披露了一组飞桨数据:飞桨累计开发者数量已超过190万,服务企业数量达8.4万家,发布模型数量已…

NPOI读写Excel
1、整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet;行:Row;单元格Cell。 2、NPOI是POI的C#版本,NPOI的行和列的index都是从…

我的vim捣鼓之路
2016-06-13 更新 绑定独立博客到域名rebootcat.com 2016-06-12 更新文中的几个链接错误,google search报错 前言 从大二的时候就开始接触Linux了,从而也接触了vi,对的,当时对这些还不太了解,不知道还有个vim,真的觉得…
代码写对了还挂了?程序媛小姐姐从 LRU Cache 带你看面试的本质
来源 | 码农田小齐责编 | Carol 前言在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题。技术面试究竟在考什么在人人都知道刷题的今天,面试官也都知道大家会刷题准备面试,代码大家都会写,那面试为什么还在考这些题&…

广船国际股份有限公司OA项目
2003年的老案例: 背景 广船国际股份有限公司是由原中国船舶工业总公司属下国有企业广州造船厂在1993年改组、在上海和香港同期上市的股份有限公司,公司享有自营进出口权。 广船国际于2002年3月通过评标后选定采用iOffice.net信息管理平台作为信息化建设…