如何创建可扩展的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,一经查实,立即删除!

相关文章

聊聊一直困扰前端程序员的浏览器兼容-【css】

1.为什么会出现浏览器兼容问题&#xff1f; 由于各大主流浏览器由不同的厂家开发&#xff0c;所用的核心架构和代码也很难重和&#xff0c;这就为各种莫名其妙的Bug(代码错误&#xff09;提供了温床。再加上各大厂商出于自身利益考虑而设置的种种技术壁垒&#xff0c;让CSS应用…

权限提升

UACMe – Defeat Windows User Account Control (UAC) https://github.com/hfiref0x/UACME MiniHook Lib project https://github.com/TsudaKageyu/minhook CrackMapExec – Active Directory Post-Exploitation Tool https://www.darknet.org.uk/2017/07/crackmapexec-active-…

java getrealpath_JavaEE路径陷阱之getRealPath

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径&#xff01;应该使用ServletContext的getResource()方法&#xff0c;直接使用相对于Web应用根目录的相对路径来获取资源。ServletContext接口中定位资源的方法getResourcejava.net.URL getResource(java.lang.St…

与客户患难与共

在採訪Werner Vogels&#xff08;亚马逊的首席技术官&#xff09;的过程中&#xff0c;他描写叙述了亚马逊的开发者是怎样跟他们的用户保持沟通的&#xff1a;记住。我们的大部分开发者都跟客户保持着良好的接触&#xff0c;因此他们对“客户喜欢什么”、“客户不喜欢什么”、“…

Camel 2.11 –没有Spring的Camel Web应用程序

在撰写本文时&#xff0c;我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件&#xff0c;该组件允许使用Camel运行Web应用程序&#xff0c;而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说&#xff0c;在2013年&#xff0c;我们…

关于盒模型的一点总结

标准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 …

java 反射机制性能_Java反射机制的用途和缺点

Java反射机制的用途和缺点反射的用途 Uses of ReflectionReflection is commonly used by programs which require the ability toexamine or modify theruntime behavior of applications running in the Java virtual machine. Thisis a relatively advancedfeature and shou…

最近的生活

这个暑假主要时间都在公司实习&#xff0c;没有去自己学习很新的一些技术&#xff0c;因为现在这个公司的技术栈不是特别的新&#xff0c;不过实习了一段时间发现&#xff0c;其实技术栈新不新和你一个新手根本就没有半毛钱关系&#xff0c;根基不牢学什么白搭是吧 举个例子&am…

将大型项目从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>"红色部分代…

java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片

正巧遇到一个项目需要图片合成&#xff0c;查阅了网上许多资料之后整理了一份生成图片的工具类&#xff0c;代码如下&#xff1a;package org.yygzs.acker.util;import java.io.IOException;import javax.imageio.ImageIO;import java.io.File;import java.awt.Font;import jav…

style对象的cssText方法

cssText 本质是什么&#xff1f; cssText 的本质就是设置 HTML 元素的 style 属性值。 cssText 怎么用&#xff1f; domElement.style.cssText "color:red; font-size:13px;"; cssText 返回值是什么&#xff1f; 在某些浏览器中&#xff08;比如 Chrome&#xff09…

Spring的Web MVC –重定向到内存泄漏

他们说一块岩石会引起雪崩。 最近&#xff0c;我的一位同事Marcin Radoszewski给了我一块岩石。 您可能永远都不会猜测它是什么&#xff0c;但是有机会在许多Web应用程序中使用它。 请允许我向您介绍这块石头。 您可能很清楚发布模式后的重定向 。 使用Spring Framework&#…

Android 学习Kotlin吗?

学习Kotlin吗&#xff1f;转载于:https://www.cnblogs.com/zhujiabin/p/8398185.html

.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…

Java – 2012年回顾和未来预测

这篇文章将重点讨论2012年发生的大小事件&#xff0c;并展望2013年的一些未来预测。其中一些预测将是诚实的猜测&#xff0c;而另一些则将是诚实的猜测。 好吧&#xff0c;只要说我的“恶魔般”的一面就已经接管了。 因此&#xff0c;我们无需再讨论Java的2012年了。 2012年–…

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

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