如何创建可扩展的Java应用程序

开放的扩展使许多应用程序受益。 这篇文章描述了两种在Java中实现这种可扩展性的方法。

可扩展的应用

可扩展应用程序是可以扩展其功能而不必重新编译它们 ,有时甚至不必重新启动它们的应用程序。 只需将jar添加到类路径中,或通过更复杂的安装过程来实现。
延伸点
Eclipse IDE是可扩展应用程序的一个示例。 它允许安装称为插件的扩展,以便可以使用新功能。 例如,您可以安装源代码管理(SCM)插件以与您喜欢的SCM一起使用。

再举一个例子,设想一个实现了的XACML规范授权 。 XACML中的“ X”代表“可扩展”,并且规范定义了许多扩展点 ,例如属性和类别ID,结合了算法,功能和策略信息点。 良好的XACML实现将允许您通过提供实现扩展点的模块来扩展产品。

服务提供商接口

Oracle用于创建可扩展应用程序的解决方案是服务提供商接口 (SPI)。

在这种方法中,扩展点由接口定义:

package com.company.application;public interface MyService {// ...
}

您可以使用ServiceLoader类找到此类扩展点的所有扩展:

public class Client {public void useService() {Iterator<MyService> services = ServiceLoader.load(MyService.class).iterator();while (services.hasNext()) {MyService service = services.next();// ... use service ...}}

此扩展点的扩展可以是实现该接口的任何类:

package com.company.application.impl;public class MyServiceImpl implements MyService {// ...
}

实现类必须是公共可用的,并且具有公共的无参数构造函数。 但是,这对于ServiceLoader类来说还远远不够。

您还必须在META-INF/services创建一个以扩展点接口的标准名称命名的文件。 在我们的示例中,将是:

META-INF/services/com.company.application.Myservice

此文件必须是UTF-8编码的,否则ServiceLoader将无法读取它。 该文件的每一行都应包含实现扩展点的一个扩展的全限定名称,例如:

com.company.application.impl.MyServiceImpl

OSGi服务

服务注册表 仅当扩展点文件位于类路径上时,上述SPI方法才有效。
在OSGi环境中,情况并非如此。 幸运的是,OSGi对于扩展性问题有自己的解决方案: OSGi服务 。

借助Declarative Services ,OSGi服务易于实现,尤其是在使用Apache Felix 服务组件运行时 (SCR)的注释 时 :

@Service
@Component
public class MyServiceImpl implements MyService {// ...
}

使用OSGi和SCR,使用服务也非常容易:

@Component
public class Client {@Referenceprivate MyService myService;protected void bindMyService(MyService bound) {myService = bound;}protected void unbindMyService(MyService bound) {if (myService == bound) {myService = null;}}public void useService() {// ... use myService ...}}

两全其美

那么,您应该选择两个选项中的哪个? 当然,这取决于您的情况。 在OSGi环境中,显然应该选择OSGi服务。 如果您不在OSGi环境中,则无法使用它们,因此只剩下SPI。

蛋糕 但是,如果您正在编写框架或库,却又不知道您的代码是否将在基于OSGi或类路径的环境中使用,该怎么办?

您将希望尽可能多地使用您的库,因此最好是同时支持这两种模型。 如果您要小心,可以这样做。

请注意,将像OSGI-INF/myServiceComponent.xml这样的Declarative Services服务组件文件添加到jar中(这是SCR注释在处理时最终会完成的工作)仅在OSGi环境中有效,但在OSGi外部无害。

同样,SPI服务文件将在传统的类路径环境中工作,但在OSGi中是无害的。

因此,这两种方法实际上是互斥的,并且在任何给定的环境中,这两种方法中只有一种会找到任何东西。 因此,您可以编写使用这两种方法的代码。 这有点重复,但是它允许您的代码在两种类型的环境中都能工作,因此您也可以吃蛋糕。

参考: 如何从安全软件开发博客上的JCG合作伙伴 Remon Sinnema 创建可扩展Java应用程序 。

翻译自: https://www.javacodegeeks.com/2012/12/how-to-create-extensible-java-applications.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于盒模型的一点总结

标准w3c盒模型图示 关于怪异盒模型和标准盒模型的对比 关于怪异盒模型盒标准盒模型之间的转换

Day 9 函数的初识1

def my_len(): l1 [1,2,3,5,6] print(111) print(222) return print(333)print(my_len())一、函数的定义1.遇到return &#xff0c;此函数结束&#xff0c;if 不在向下进行:2.return 的返回值 1. 不写return 返回为none 2. return non &#xff0c;和1 …

将大型项目从Ant迁移到Maven

事实是&#xff0c;我们处在艰难时期。 我们花了将近三个月的时间将构建机制从Ant迁移到Maven 。 如果您打算在大型项目中做同样的事情&#xff0c;那就是您必须安排的最短时间。 我们仍在努力解决这种迁移带来的一些附带影响&#xff0c;但幸运的是&#xff0c;它们并不是那么…

移动端布局方案探究

研究了淘宝&#xff0c;天猫和网易彩票163的wap主页样式布局&#xff0c;总结移动端布局方案 注意&#xff1a;代码运行是file协议&#xff0c;在chrome里不支持引用本地文件&#xff0c;会提示跨域错误&#xff0c;可以用firefox或者Safari打开 当时做的ppt下载: 2015年12月移…

搭建springboot环境

1.前戏准备: SpringBoot核心jar包:这里直接从Spring官网下载了1.5.9版本. jdk:jdk1.8.0_45. maven项目管理工具:3.5版本. tomcat:8.5版本. 本地仓库:注意settings.xml里面的设置"<localRepository>E:/SpringBoot/repository</localRepository>"红色部分代…

.Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南

.NET Standard 2.0 发布日期&#xff1a;2017年8月14日公告原文地址 前言 早上起来.NET社区沸腾了&#xff0c;期待已久的.NET Core 2.0终于发布&#xff01;根据个人经验&#xff0c;微软的产品一般在2.0时会趋于成熟&#xff0c;所以一个新的.Net开发时代已经来临&#xff01…

jquery中的创建节点和添加节点的方法

今天来说一下针对jquary关于创建节点和添加节点的方法&#xff0c;先来看看创建节点&#xff1a; 1、直接添加节点内容即可 $("div").append(<a href"http://www.baidu.com">百度一下</a>); 2、可以创建jquary对象添加进去 var $li$(<a hre…

移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~

在移动端 H5 页面开发中&#xff0c;我使用了 fixed 固定某个元素在屏幕的最下方&#xff0c; 这时点击输入框&#xff0c;接着非常非常自然地出现了元素被系统键盘顶起来的情况&#xff0c;如下图。 解决方案: 首先&#xff0c;给页面最外层包裹一层 div(相对定位) &#xf…

momentum公式

momentum对于w的更新公式&#xff1a; http://caffe.berkeleyvision.org/tutorial/solver.html转载于:https://www.cnblogs.com/ymjyqsx/p/7364743.html

带弹簧的Hazelcast分布式执行

ExecutorService功能是Java 5附带的&#xff0c;位于java.util.concurrent包中。 它扩展了Executor接口&#xff0c;并提供了线程池功能来执行异步简短任务。 建议使用Java Executor服务类型来查看基本的ExecutorService实现。 此外&#xff0c;ThreadPoolExecutor是ExecutorS…

Manacher's Algorithm 马拉车算法(最长回文串)

这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法&#xff0c;由一个叫Manacher的人在1975年发明的&#xff0c;这个方法的最大贡献是在于将时间复杂度提升到了线性&#xff0c;这是非常了不起的。对于回文串想必大家都不陌生&#xff0c;就是…

java咖啡机故障5_【咖啡小常识】咖啡机不得不知道的常见故障及解决方法

原标题&#xff1a;【咖啡小常识】咖啡机不得不知道的常见故障及解决方法咖啡行业交流请加私人微信精品咖啡香&#xff0c;微信号&#xff1a;(长按复制)thinkingcapacity一&#xff0e;没有蒸汽或做出的咖啡不热可能原因1、在一个时间段放出了大量的热水(不建议使用咖啡机自带…

idiom的学习笔记(一)、三栏布局

三栏布局左右固定&#xff0c;中间自适应是网页中常用到的&#xff0c;实现这种布局的方式有很多种&#xff0c;这里我主要写五种。他们分别是浮动、定位、表格、flexBox、网格。 在这里也感谢一些老师在网上发的免费教程&#xff0c;使我们学习起来更方便&#xff01;&#x…

USB之HID类Set_Report Request[调试手记1]

请翻开《Device Class Definition for Human Interface Devices (HID) Version 1.11 》7.2.2 Set_Report Request 现在我们先那键盘来做实验来观察。[备注:测试当时NUM指示灯亮] 通过笔记本上按“capslock”按键来观察外置键盘上大小写的指示灯。 通过USBlyzer观察到 发送03的…

Devoxx 2012:Java 8 Lambda和并行性,第1部分

总览 Devoxx是世界上最大的独立于供应商的Java会议&#xff0c;于11月12日至16日在比利时的Atwerp举行。 今年规模更大了&#xff0c;来自40个不同国家的3400名与会者。 和去年一样 &#xff0c;我和来自SAP的一小群同事都来了&#xff0c;并享受了很多。 在Nao机器人令人印象…

前端常见的十七个框架

本文作者祈澈姑娘&#xff0c;转载请声明 前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余…

Cesium调用Geoserver发布的 WMS、WFS服务

1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装&#xff0c;同时安装geopackage扩展&#xff0c;以备使用。使用XX地图下载器下载地图&#xff0c;导出成GeoPackage地图文件。 &#xff08;1&#xff09;下载 GeoPackage DEM数据 &#xff08;2&#xff09;打开GeoS…

如何用ThreadLocals射击自己

它将很好地启动。 像大多数故事一样。 您会发现一个新概念&#xff0c;并对其功能感到惊讶。 然后突然装备了这把新锤子&#xff0c;一切开始看起来像钉子。 根据我们过去几个月的经验&#xff0c; java.lang.ThreadLocal真是一锤定音。 我想这全都归结为ThreadLocal的工作原理…

确保任务的执行顺序

有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况&#xff1a;我们有多个连接&#xff0c;使用NIO可以从中读取。 我们需要确保给定连接中的事件按顺序执行&#xff0c;但是不同连接之间的事件可以自由混合。 我想提出一个类似但…

transition

一、语法 transition: property duration timing-function delay transition属性是个复合属性&#xff0c;她包括以下几个子属性&#xff1a; transition-property &#xff1a;规定设置过渡效果的css属性名称transition-duration &#xff1a;规定完成过渡效果需要多少秒或…