• Service Provider Interface


    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

  • 相关阅读:
    ubuntu英文环境下使用中文输入法
    Flex 调用添加了SoapHeader的web service
    RoR: Ruby On Rails Web Service 3 分发模式
    C# CRC8实现
    java正则表达式过滤html标签
    静态内部类和非静态内部类的区别
    Java反射机制
    java回调函数简介
    Java之泛型编程
    Java基础知识之系统命令调用、序列化、JDO、匿名内部类
  • 原文地址:https://www.cnblogs.com/leodaxin/p/8424347.html
Copyright © 2020-2023  润新知