如何在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罐 >提供接口 装订/司机罐 >实现界面 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – JodaTime字符串yyyy-mm-ddThh:mmss.Z到DateTime
- java – 在GZIP文件中查找文件的大小
- 请别再拿“String s = new String("xyz");创建了多
- java – Ehcache自动生成密钥和@Cacheable弹簧注释
- java设计模式--职责链模式
- java – 如何启动在其他Android项目中定义的活动?
- java – Eclipse:OSGI首选项与PreferenceStore
- 如何使用Java2D绘制内部笔划
- java – 为什么不使用堆数组的元素零?
- Java concurrency之互斥锁_动力节点Java学院整理