转载

Java SPI 快速入门Demo

1.什么是Java SPI ?

SPI全称Service Provider Interface,在Java中还是一个比较重要的概念,是Java提供的一套用来被第三方实现或者扩展的API,或者换句话说,SPI是一种服务发现机制。 SPI 将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦,能够提升程序的扩展性、可维护性。修改或者替换服务实现并不需要修改调用方。 很多框架都使用了 Java 的 SPI 机制,比如:Spring 框架、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等。

2.SPI原理是什么?

要使用SPI比较简单,只需要按照以下几个步骤操作即可:
  • 在jar包的META-INF/services目录下创建一个以"接口全限定名"为命名的文件,内容为实现类的全限定名
  • 接口实现类所在的jar包在classpath下
  • 主程序通过java.util.ServiceLoader动态状态实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM
  • SPI的实现类必须带一个无参构造方法

3.代码工程

实验目标

基于spi实现搜索功能扩展

service

package com.et;

public interface SearchService {
    String search(String key);
}
package com.et;

public class RedisSearch implements SearchService{

    @Override
    public String search(String key) {
        return "Redissearch" + key + "result Yes";
    }
}
package com.et;

public class MysqlSearch implements SearchService{

    @Override
    public String search(String key) {
        return "Mysqlsearch" + key + "result No";
    }
}

com.et.SearchService

com.et.MysqlSearch
com.et.RedisSearch

4.测试

测试类

package com.et;

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
            ServiceLoader<SearchService> serviceLoader = ServiceLoader.load(SearchService.class);
            System.out.println("============ Java SPI test===========");
            serviceLoader.forEach(loader -> System.out.println(loader.search("Yes Or No")));
        }

}
运行main方法
============ Java SPI test===========
MysqlsearchYes Or Noresult No
RedissearchYes Or Noresult Yes

5.引用

 
正文到此结束
Loading...