简单的Java“服务提供者框架”?

2023-12-20

我指的是“服务提供商框架”,如中讨论的,这似乎是处理我遇到的问题的正确方法,我需要在运行时实例化几个类之一,基于String选择哪个服务,以及Configuration对象(本质上是一个 XML 片段):

但是我如何让各个服务提供商(例如一堆默认提供商+一些自定义提供商)自行注册?

 interface FooAlgorithm
 {
     /* methods particular to this class of algorithms */
 }

 interface FooAlgorithmProvider
 {
     public FooAlgorithm getAlgorithm(Configuration c);
 }

 class FooAlgorithmRegistry
 {
     private FooAlgorithmRegistry() {}
     static private final Map<String, FooAlgorithmProvider> directory =
        new HashMap<String, FooAlgorithmProvider>();
     static public FooAlgorithmProvider getProvider(String name)
     {
         return directory.get(serviceName);
     }
     static public boolean registerProvider(String name, 
         FooAlgorithmProvider provider)
     {
         if (directory.containsKey(name))
            return false;
         directory.put(name, provider);
         return true;
     }
 }

例如如果我编写自定义类 MyFooAlgorithm 和 MyFooAlgorithmProvider 来实现 FooAlgorithm,并将它们分发到 jar 中,是否有任何方法可以自动调用 registerProvider,或者使用该算法的客户端程序必须显式调用 FooAlgorithmRegistry.registerProvider()对于他们想要使用的每个类?


我认为您需要创建一个 META-INF/services/filled.qualified.ClassName 并在那里列出内容,但我不记得规范(JAR 文件规范 http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html or this http://www.velocityreviews.com/forums/t152645-how-is-spi-service-provider-interface-works.html).

The 一位 Java 架构师的实用 API 设计自白本书第8章是关于SPI的。

ServiceLoader 可能会帮助您列出可用的实现。例如使用 PersistenceProvider 接口:

ServiceLoader<PersistenceProvider> loader = 
        ServiceLoader.load(PersistenceProvider.class);
Iterator<PersistenceProvider> implementations = loader.iterator();
while(implementations.hasNext()) {
    PersistenceProvider implementation = implementations.next();
    logger.info("PersistenceProvider implementation: " + implementation);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的Java“服务提供者框架”? 的相关文章

  • java.lang.VerifyError:JVMVRFY012堆栈形状不一致;

    在 WAS 8 5 5 中部署 Maven 项目时出现以下错误 我在WAS中安装了JDK 1 6和1 7 错误500 org springframework web util NestedServletException 处理程序处理失败
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 查询 MongoDB 集合中的字段。

    我正在尝试查询 mongodb 集合中的特定字段 这是我的代码和输出 Mongo m new Mongo DB db m getDB mydb DBCollection coll db getCollection student addin
  • Java 卡布局。多张卡中的一个组件

    一个组件 例如JLabel 在多张卡中使用CardLayout 目前看来该组件仅出现在它添加到的最后一张卡上 如果有办法做到这一点 我应该吗 这是不好的做法吗 或者有其他选择吗 你是对的 它只出现在 添加到的最后一张卡 中 但这与CardL
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 即使在轴上进行自动量程调整,我也可以保留积分刻度线吗?

    我 偷 了一些代码here http fxexperience com 2012 01 curve fitting and styling areachart 拥有一个AreaChart我在 FXML 中使用了 平滑线条 它的工作原理如下
  • 如何在 MSSQL 中获取 CURRENT_DATE?

    我正在使用 jpa 3 o 和 Hibernate 我有一个命名查询 SELECT COUNT wt id FROM WPSTransaction wt WHERE wt createdDate gt CURRENT DATE WPSTra
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 如何在 JPA 和 Hibernate 中将数据库生成的列值定义为只读字段?

    使用 MariaDB 10 2 可以定义日期时间的默认值 例如创建和最后修改 我应该如何将此列作为只读字段访问 因为这个值应该只在数据库的控制之下 并且不应该从代码中修改 但我想在代码中读取这个属性 这很简单 只需设置insertable
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • JUNIT 测试 void 方法

    我有一个充满 void 方法的 java 类 我想进行一些单元测试以获得最大的代码覆盖率 例如我有这个方法 protected static void checkifValidElements int arg1 int arg2 metho
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 当底层连接是有状态时如何使用 Apache HttpClient?

    我在谷歌上搜索了很多关于如何使用 HttpClient 进行多线程处理的信息 他们中的大多数人建议使用 ThreadSafeClientConnManager 但我的应用程序必须登录某个主机 登录表单页面 以便 HttpClient 获得底
  • 删除 JFX 中选项卡后面的灰色背景

    So is there any way to remove the gray area behind the tab s 我尝试过用 CSS 来做到这一点 但没有找到方法 要设置 tabpane 标题的背景颜色 请在 CSS 文件中写入 t
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • Collections.sort(list) 和 list.sort(Comparator) 之间的区别

    有什么理由让我应该选择Collections sort list 方法而不是简单地调用list sort 内部Collections sort只是调用sort的方法List无论如何 上课 令人惊讶的是几乎每个人都告诉我使用Collectio
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • 为什么java.lang.Cloneable不重写java.lang.Object中的clone()方法?

    Java 规范java lang Cloneable接口将自身定义为表示扩展它的任何对象也实现了clone 休眠的方法java lang Object 具体来说 它说 一个类实现了Cloneable接口来指示java lang Object
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr

随机推荐

  • 具有多个 https 站点的 HAproxy

    我们有几个在负载均衡器后面运行的 http 站点 使用hearbeat 具有故障转移功能 和一个 https 站点 一切都运行良好 但现在我想要 添加另一个 https 站点 我找不到任何托管多个 https 站点的参考资料 有人使用 HA
  • 在 pySpark 中使用 paramGrid 从 CrossValidator 中提取结果

    我用 pySpark 训练随机森林 我想要一个包含网格中每个点的结果的 csv 我的代码是 estimator RandomForestRegressor evaluator RegressionEvaluator paramGrid Pa
  • 了解 openmp 中的折叠子句

    我遇到了一个包含崩溃子句的 OpenMP 代码 这对我来说是新的 我试图理解它的含义 但我认为我还没有完全理解它的含义 我发现的一个定义是 COLLAPSE https computing llnl gov tutorials openMP
  • JavaScript document.domain 未捕获 DOMException:阻止了具有原点的框架

    当我测试 SOP 时 我遇到了这种情况 两个文档与我预期的同一域有关系 当我尝试获取位置时 它会抛出错误 要重现该问题 Open https www google com https www google com 从控制台let opene
  • 为什么 '\x' 在 Python 中无效?

    我正在尝试使用 字符 使用 a b c 只是为了自己枚举Python将哪些字符解释为控制字符以及解释为什么 这是我发现的 a BELL b BACKSPACE f FORMFEED n LINEFEED r RETURN t TAB v V
  • Visual Studio 代码组织导入功能

    在 Visual Studio Code 1 23 版本中 添加了 组织导入 功能 这是一个非常有用的功能 因为它本身可以处理导入 但我希望能够对其进行配置 我想知道此功能是否可用的功能有 是否可以配置导入的排序顺序 我想在本地导入之前配置
  • Log4Net 不记录或出错

    我一直在尝试在我的 ASP NET Web 应用程序中获取 log4net 日志记录 但没有成功或任何明显的错误 我尝试使用具有以下配置的 ADONetAppender 附加程序
  • OSError:[Errno 24]打开的文件太多 - OS Mojave

    因此 我正在编写一个脚本来获取某个数据集 使用不同的随机种子对其进行 100 次采样 完成所有这些数据集 然后获取平均误差 但是 每当我尝试运行该脚本时 都会出现错误 OSError Errno 24 Too much open files
  • Drupal 通过代码在投票 API 中创建投票

    我正在编写一个自定义模块 我希望它做的部分工作是创建与节点关联的投票 我试图弄清楚如何从我的模块调用投票 API 我查看了文档 但它有点稀疏 这是我不久前编写的模块中的一个示例 while data db fetch object resu
  • EventTrigger 中的条件

    我可以检查事件触发器内的条件吗 我怎样才能只使用 XAML 来做类似的事情
  • 更改 Beaglebone Black 的 USB0 地址?

    我正在尝试更改 BeagleBone Black USB0 端口的静态 IP 地址 我知道这个线程之前已经打开过 更改 Beagle Bone Black USB0 的静态 IP https stackoverflow com questi
  • 在Stata中,如何组合不同宽度的箱线图?

    我正在尝试组合不同大小类别的多个箱线图 这是说明问题的示例 sysuse auto graph box mpg by rep78 rows 1 name g1 replace graph box mpg by foreign rows 1
  • python长度为k的0,1的所有可能组合[重复]

    这个问题在这里已经有答案了 我需要长度为 k 的 0 1 的所有可能组合 假设 k 2 我想要 0 0 0 1 1 0 1 1 我尝试过不同的功能itertools但我没有找到我想要的 gt gt gt list itertools com
  • 使用 Runtime.exec 从 Java 应用程序启动 JVM 进程?

    我希望能够从现有的 java 应用程序启动 Java 服务器进程并监视 stdoutput 和 stderror 并将该输出重定向到文件 是使用 Runtime exec 并将应用程序视为任何其他操作系统进程的最佳方法 还是有更适合新 JV
  • docker 中没有暴露和发布端口的连接

    我有一些中间件在 Docker 容器中运行 当我运行这个中间件时在我的主机上一切正常 当我在docker装有所有必要物品的容器暴露和发布的端口 Dockerfile EXPOSE 5672 15672 1337 1338 5556 3000
  • 网站安全问题

    我正在创建一个使用 perl 脚本 PHP MySQL 数据库和 HTML 的网站 我主要关心的是确保任何人都无法访问任何可以让他们访问我的信息的东西 我的意思是是否有人可以获取我的 perl 脚本并查看我的数据库信息 我了解 sql 注入
  • 如果我已经安装了 Anaconda 发行版并且想要使用其他文本编辑器,我还需要安装 Python 吗?

    我对 Python 和一般编程不太熟悉 过去几个月一直在 Windows 10 上使用 Anaconda 发行版的 Spyder IDE 它非常简单且易于下载和使用 我可以在IDE 让我很容易开始学习Python 我现在对 Python 和
  • Blazor - 当子组件 onclick 事件发生时执行父组件的方法

    我需要它onclick子组件中发生的事件 执行ShowMessage父组件传递的方法message字符串作为参数 以下代码不起作用 儿童剃须刀
  • 删除 NaN“单元格”而不删除整个 ROW(Pandas、Python3)

    现在我有一个这样的DF Word Word2 Word3 Hello NaN NaN My My Name NaN Yellow Yellow Bee Yellow Bee Hive Golden Golden Gates NaN Yell
  • 简单的Java“服务提供者框架”?

    我指的是 服务提供商框架 如中讨论的 这似乎是处理我遇到的问题的正确方法 我需要在运行时实例化几个类之一 基于String选择哪个服务 以及Configuration对象 本质上是一个 XML 片段 但是我如何让各个服务提供商 例如一堆默认