Jas*_*n S 5 java factory service-provider
我指的是有效Java第2章中讨论的"服务提供者框架" ,这似乎是处理我遇到的问题的正确方法,我需要在运行时实例化几个类中的一个,基于a 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;
}
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我编写自定义类MyFooAlgorithm和MyFooAlgorithmProvider来实现FooAlgorithm,并将它分发到jar中,是否有任何方法可以自动调用registerProvider,或者我使用该算法的客户端程序是否必须显式调用FooAlgorithmRegistry.registerProvider( )他们想要使用的每个班级?
aka*_*okd 10
我认为你需要创建一个META-INF/services/fully.qualified.ClassName并列出那些东西,但我不记得规范(JAR文件规范或者这个).
Java架构师第8章的实用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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4403 次 |
| 最近记录: |