码迷,mamicode.com
首页 > 其他好文 > 详细

Service Provider Interface

时间:2018-02-06 23:03:04      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:cep   over   文件的   throws   ted   com   多行   建立   ide   

1.什么是java的SPI

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。

具体是在JAR包的"src/META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名.

 

2.运用场景

比如你想扩展一些框架,如spring的一些功能,就是要实现它接口,然后自己配置了。

 

3.例子代码

先定义接口:

  

技术分享图片
package com.ming.spi.service;

/**
 * 定义一个dog的接口
 * @author ming
 *
 */
public interface DogService {

    void sleep();
}
技术分享图片

然后定义两个实现:

技术分享图片
package com.ming.spi.service.imp;

import com.ming.spi.service.DogService;

public class BlackDogServiceImpl implements DogService{

    @Override
    public void sleep() {
        System.out.println("黑色dog。。。汪汪叫,不睡觉...");
        
    }
    
}
技术分享图片
技术分享图片
package com.ming.spi.service.imp;

import com.ming.spi.service.DogService;

public class WhilteDogServiceImpl implements DogService{

    @Override
    public void sleep() {
        System.out.println("白色dog。。。呼呼大睡觉...");
        
    }

}
技术分享图片

最后是一个测试代码:

技术分享图片
package com.ming.spi.service;

import java.util.ServiceLoader;

public class Test {

    public static void main(String[] args) throws Exception {
        ServiceLoader<DogService> loaders = ServiceLoader.load(DogService.class);
        for (DogService d : loaders) {
            d.sleep();
        }
    }
}
技术分享图片

 

然后是src/META-INF/services/com.ming.spi.service.DogService文件中的代码:

com.ming.spi.service.imp.BlackDogServiceImpl
com.ming.spi.service.imp.WhilteDogServiceImpl

 

最后运行结果就是你需要的两个实现。(JDBC实现就是这个思路)

 

最后总结一下:

java的spi运行流程是运用java.util.ServiceLoader这个类的load方法去在src/META-INF/services/寻找对应的全路径接口名称的文件,然后在文件中找到对应的实现方法并注入实现,然后你可以运用了

 

 

 

参考:http://www.cnblogs.com/zhongkaiuu/articles/5040971.html

Service Provider Interface

标签:cep   over   文件的   throws   ted   com   多行   建立   ide   

原文地址:https://www.cnblogs.com/leodaxin/p/8424347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!