首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中实现API/SPI模式?

如何在Java中实现API/SPI模式?
EN

Stack Overflow用户
提问于 2012-07-09 22:38:29
回答 1查看 10.8K关注 0票数 10

我正在创建一个框架,该框架公开了一个供开发人员使用的API:

代码语言:javascript
复制
public interface MyAPI {
    public void doSomeStuff();

    public int getWidgets(boolean hasRun);
}

开发人员所要做的就是根据这些API方法编写他们的项目。我还希望它们能够在运行时类路径上放置不同的“驱动程序”/“API绑定”(与JDBC或SLF4J工作方式相同),并具有API方法调用(doSomeStuff()等)。操作不同的第三方资源(文件,服务器,其他)。因此,相同的代码和API调用将映射到不同资源上的操作,具体取决于运行时类路径看到的驱动程序/绑定(即myapi-ftpmyapi-sshmyapi-teleportation)。

如何编写(并打包)允许这样的运行时绑定的SPI,然后将MyAPI调用映射到正确的(具体的)实现?换句话说,如果myapi-ftp允许您从FTP服务器获得getWidgets(boolean),我将如何提高(同时使用API和SPI)?

加分的具体,工作Java代码的例子!提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-10 02:04:41

看看java.util.ServiceLoader类。

一般来说,这样的想法是:

API Jar

  • 提供接口
  • 使用ServiceLoader类查找实现绑定/驱动程序Jar

  • 实现接口
  • 创建文件META/并指定实现它的类名-在javadocs中有一个很好的示例: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html API Jar 包com.foo;公共接口FooInterface {.}公共类FooInterfaceFactory {公共静态FooInterface newFooInstance() { ServiceLoader加载程序= ServiceLoader.load(FooInterface.class);Iterator it = loader.iterator();//选择提供的实现之一并返回它。} 绑定罐 包com.myfoo;公共类MyFooImpl实现FooInterface {.}META/com.foo.fooInterface com.myfoo.MyFooImpl 编辑 SPI示例 公共接口FooSpi { void接受(String url);FooInterface getFooInstance();}公共类FooInterfaceFactory {公共静态FooInterface getFooInterfaceInstance(String url) { ServiceLoader加载程序= ServiceLoader.load(FooSpi.class);Iterator it = loader.iterator();而(it.hasNext()) { FooSpi fooSpi = it.next();if (fooSpi .accepts(url)) {返回fooSpi.getFooInstance();}返回null;}} 当然,将文件名更改为com.foo.FooSpi并提供FooSpi的实现。这将允许您将公共API与Spi接口隔离开来。 如果要隐藏接受方法,则始终可以有第二个接口,即您的公共API和t。
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11404230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档