ServiceLoader : JAVA SPI 机制
来源:互联网 发布:实惠猪软件怎么样 编辑:程序博客网 时间:2024/06/05 16:29
SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。
简单来说就是通过配置文件指定接口的实现类。
当我们开发一套框架、一套机制、一个插件或一套API时候,如果需要第三方的服务支持,可以直接写死到代码里面,但这种方式耦合太强,不利于切换到其它服务,好的方法是写一个配置文件指定服务的实现方,幸运的是java的spi机制已经帮我们做好了,示例用法如下:
一个接口:
package testws;public interface TestEJB { void test(String data) throws Exception; void test0(String data) throws Exception;}第一个实现类:
package testws;public class MyTest implements TestEJB { public void test(String data) throws Exception { System.out.println("my test:" + data); } public void test0(String data) throws Exception { System.out.println("test0:" + data); }}第二个实现类:
package testws;public class MyTest2 implements TestEJB { public void test(String data) throws Exception { System.out.println("my test2222:" + data); } public void test0(String data) throws Exception { System.out.println("test02222222:" + data); }}
建立 META-INF文件夹,在其里面建立 services文件夹,在services文件夹下建立一个文件,名称为我们需要实现的服务的全类名,即:testws.TestEJB
文件testws.TestEJB的内容如下:(PS:如果我们只需要一个实现类,下面可以只写一个,每一个实现类占一行)
testws.MyTesttestws.MyTest2
最后一个步骤:将三个java类和META-INF 文件夹打包到一个jar中,就可以使用了,使用方式:
import java.util.ServiceLoader;public class TestSPI { public static void main(String[] args) { ServiceLoader<TestEJB> loadedImpl = ServiceLoader.load(TestEJB.class); for (TestEJB testEJB : loadedImpl) { System.out.println(testEJB.getClass()); try { testEJB.test("a"); } catch (Exception e) { e.printStackTrace(); } } }}
打印如下:
class testws.MyTestmy test:aclass testws.MyTest2my test2222:a
0 0
- ServiceLoader : JAVA SPI 机制
- Java ServiceLoader(SPI)学习
- Java ServiceLoader(SPI)学习
- Java ServiceLoader(SPI)学习
- ServiceLoader java
- java ServiceLoader
- Java的SPI机制
- java spi 机制
- java中的SPI机制
- Java的SPI机制
- Java SPI机制
- Java spi机制
- Java SPI机制
- Java spi机制浅谈
- java中的SPI机制
- Java SPI机制
- Java SPI机制
- Java SPI机制简介
- Android内核开发:浅析APK的安装过程
- java线程之间通信
- 二叉树 之 lowest common ancestor 最低公共祖先
- Python 爬虫的工具列表
- 华为oj:
- ServiceLoader : JAVA SPI 机制
- JAVA_对象一对一关系 ObjectOneToOneRelationship.java
- [数据库 开发] SQL多表连接查询(详细实例)
- Corona的屏幕适配
- 接受远程接口访问数据
- 史上最易懂的Android jni开发资料--NDK环境搭建
- 开启linux的路由转发功能
- this和super
- wrap_content和实际大小的区别