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

前端之家收集整理的这篇文章主要介绍了如何在Java中实现API / SPI模式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个暴露API的框架供开发人员使用:
public interface MyAPI {
    public void doSomeStuff();

    public int getWidgets(boolean hasRun);
}

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

如何编写(和打包)一个允许这样的运行时绑定的SPI,然后将MyAPI调用映射到正确的(具体的)实现?换句话说,如果myapi-ftp允许从FTP服务器获取Widgets(boolean),那么我该怎么做(使用API​​和SPI)?

奖金积分具体,工作Java代码示例!提前致谢!

解决方法

看看java.util.ServiceLoader类.

一般来说,这个想法是:

API罐

>提供接口
>使用ServiceLoader类来查找实现

装订/司机罐

>实现界面
>创建文件Meta-INF /并指定实现它的类名

javadoc中有一个很好的例子:

http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

API罐

package com.foo;

public interface FooInterface { ... }

public class FooInterfaceFactory {
  public static FooInterface newFooInstance() {
    ServiceLoader<FooInterface> loader = ServiceLoader.load(FooInterface.class);
    Iterator<FooInterface> it = loader.iterator();
    // pick one of the provided implementations and return it.
  }

装订罐

package com.myfoo;
public class MyFooImpl implements FooInterface { ... }

Meta-INF/com.foo.FooInterface
    com.myfoo.MyFooImpl

编辑

SPI示例

public interface FooSpi { 
   void accepts(String url);
   FooInterface getFooInstance();
}


public class FooInterfaceFactory {
  public static FooInterface getFooInterfaceInstance(String url) {
    ServiceLoader<FooSpi> loader = ServiceLoader.load(FooSpi.class);
    Iterator<FooSpi> it = loader.iterator();
    while (it.hasNext()) {
       FooSpi fooSpi = it.next();
       if (fooSpi .accepts(url)) {
         return fooSpi.getFooInstance();
       }
    }

    return null;
  }
}

当然,将文件名更改为com.foo.FooSpi并提供FooSpi的实现.这将允许您将公共API与Spi界面隔离开来.

如果你想隐藏接受方法,你可以永远有一个第二个接口,这是你的公共API,而t

原文链接:https://www.f2er.com/java/124710.html

猜你在找的Java相关文章