gpt4 book ai didi

java - 简单的 Java "Service Provider frameworks"?

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:49 24 4
gpt4 key购买 nike

我引用了 Chapter 2 of Effective Java 中讨论的“服务提供者框架” ,这似乎是处理我遇到的问题的正确方法,我需要在运行时实例化几个类之一,基于 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()他们想使用的每个类(class)?

最佳答案

我认为您需要创建一个 META-INF/services/fully.qualified.ClassName 并在其中列出内容,但我不记得规范(JAR File Specificationthis)。

The Practical API design confessions of a Java architect 书第 8 章是关于 SPI 的。

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

ServiceLoader<PersistenceProvider> loader = 
ServiceLoader.load(PersistenceProvider.class);
Iterator<PersistenceProvider> implementations = loader.iterator();
while(implementations.hasNext()) {
PersistenceProvider implementation = implementations.next();
logger.info("PersistenceProvider implementation: " + implementation);
}

关于java - 简单的 Java "Service Provider frameworks"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com