当前位置: 首页 > 面试题库 >

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

柳珂
2023-03-14
问题内容

我指的是“ 有效Java
”的第2章中讨论的“服务提供者框架”
,这似乎是解决我遇到的问题的正确方法,其中我需要在运行时实例化几个类之一,并根据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 /
fully.qualified.ClassName并在其中列出内容,但是我不记得该规范(JAR File
Specification或this)。

一个Java架构师的实用API设计的自白 书第八章是关于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);
}


 类似资料:
  • 简介 服务提供者是所有 Lumen 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Lumen 核心服务,都是通过服务提供者启动的。 但是,我们所说的「启动」指的是什么?一般而言,我们指的是 注册 事物,包括注册服务容器绑定、事件侦听器、中间件,甚至路由。服务提供者是设置你的应用程序的中心所在。 若你打开 Lumen 的 bootstrap/app.php 文件,你将会看到 $app->

  • 服务提供者是组件和CatLib联系的桥梁。同时也是CatLib启动的中心,所有的服务都是通过服务提供者定义的。 名词定义 组件 组件与CatLib没有任何关系,她们可以独立的运行在不同的框架中。 服务 是由服务提供者将由一个或者多个组件组合而成,并提供一组可以被开发者使用的接口。 容器 CatLib 依赖注入容器。 架构图 创建服务提供者 服务提供者是用来描述一个服务如何为使用者提供服务的,这些关

  • 首先说明一下,为了便于讲解,本节之后,如无特殊说明,均是以单点的Eureka进行讲解的。 服务提供者和服务消费者 下面这张表格,简单描述了服务提供者/消费者是什幺: 名词 概念 服务提供者 服务的被调用方(即:为其他服务提供服务的服务) 服务消费者 服务的调用方(即:依赖其他服务的服务) 服务提供者代码示例 这是一个稍微有点复杂的程序。我们使用spring-data-jpa操作h2数据库,同时将该

  • 服务提供者是 laravel 框架的重要组成部分,承载着各种服务,自定义的应用以及所有 Laravel 的核心服务都是通过服务提供者启动。本文将会介绍服务提供者的源码分析,关于服务提供者的使用,请参考官方文档 :服务提供者。 服务提供者的注册 服务提供者的启动由类 IlluminateFoundationBootstrapRegisterProviders::class 负责,该类用于加载所有服务

  • 问题内容: 当我有嵌套在根组件下的组件时,我无法实例化我的应用程序,该组件在其构造函数中使用。 我想知道为什么这种行为是非法的。假设我想在班级中使用该类,而只是在班级中引用该类。这似乎是不可能的。 创建层次结构的正确方法是什么? 谢谢你 PLNKR:http ://plnkr.co/edit/5Z0QMAEyZNUAotZ6r7Yi?p=preview 问题答案: 您可以直接将父组件注入到组件中,

  • 问题内容: 有谁知道将Java方法发布为Web服务的非常简单的方法?我真的不想要使用Tomcat或Jetty或任何其他容器框架的开销。 方案:我想从本地LAN上的其他计算机访问服务类型应用程序中的一组Java方法。 问题答案: 好吧,Tomcat或Jetty对于将某些方法发布为Web服务可能是过大的。但是另一方面,它并不太复杂,他们可以完成工作,那么为什么不呢? 不久前我遇到了类似的问题,并将To