java中spi使用详解
一、简介
java中spi(service provider interface)是jdk内置的一种服务发现机制,可以基于配置,在运行时加载指定服务。java中提供了很多服务提供接口,如jdbc、jndi等。
1.什么是SPI
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
2.SPI和API的使用场景
API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。 从使用人员上来说,API 直接被应用开发人员使用。
SPI (Service Provider Interface)是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。
二、开发步骤
spi开发中,涉及接口、实现类、配置文件和服务加载,具体开发步骤如下:
定义接口和实现类(可多个);
在项目resources目录下创建META-INF/services文件夹,接着在services文件夹下创建以接口完整类路径名(包含包路径和接口名)为文件名的文件,文件内容为需要加载的服务(实现类)的完整类路径名,一行一个;
目录结构类似:
resources-- |-services-- |-com.dragon.study.spring_boot_main.spi.Hello
文件内容类似:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
在启动类中加载服务,代码类似:
//加载方式一
Iterator<Hello> it = Service.providers(Hello.class);
while(it.hasNext()){
it.next().hello();
}
//加载方式二
ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
for (Hello h : hellos){
h.hello();
}
三、使用示例
3.1 定义接口和实现类
接口:
package com.dragon.study.spring_boot_main.spi;
public interface Hello {
void hello();
}
实现类一:
package com.dragon.study.spring_boot_main.spi;
public class HelloOne implements Hello {
@Override
public void hello() {
System.out.println("hello one");
}
}
实现类二:
package com.dragon.study.spring_boot_main.spi;
public class HelloTwo implements Hello {
@Override
public void hello() {
System.out.println("hello two");
}
}
3.2 定义配置文件
在resources/META-INF/services目录下创建配置文件com.dragon.study.spring_boot_main.spi.Hello,内容如下:
com.dragon.study.spring_boot_main.spi.HelloOne com.dragon.study.spring_boot_main.spi.HelloTwo
3.3 启动类中加载服务
package com.dragon.study.spring_boot_main.spi;
import sun.misc.Service;
import java.util.Iterator;
import java.util.ServiceLoader;
public class SpiMain {
public static void main(String[] args) {
//加载方式一
// Iterator<Hello> it = Service.providers(Hello.class);
// while(it.hasNext()){
// it.next().hello();
// }
//加载方式二
ServiceLoader<Hello> hellos = ServiceLoader.load(Hello.class);
for (Hello h : hellos){
h.hello();
}
}
}
启动后输出:
hello one
hello two
总结
到此这篇关于java中spi使用的文章就介绍到这了,更多相关java中spi使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java String源码contains题解重复叠加字符串匹配
这篇文章主要为大家介绍了Java String源码contains题解重复叠加字符串匹配示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
解决Springboot中Feignclient调用时版本问题
这篇文章主要介绍了解决Springboot中Feign client调用时版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03
浅谈Mybatis Plus的BaseMapper的方法是如何注入的
我们在用的时候经常就是生产自定义的Mapper继承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就详细的介绍一下,感兴趣的可以了解一下2021-09-09
Spring JPA deleteInBatch导致StackOverflow问题
这篇文章主要介绍了Spring JPA deleteInBatch导致StackOverflow问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-05-05
Spring Boot集成Spring Cloud Eureka进行服务治理的方法
本文通过详细的步骤和代码示例,介绍了如何在Spring Boot中集成Spring Cloud Eureka进行服务治理,通过这种方式,可以有效地管理和维护微服务架构中的服务,感兴趣的朋友跟随小编一起看看吧2024-11-11
SpringMVC中@ModelAttribute与@RequestBody的区别及说明
这篇文章主要介绍了SpringMVC中@ModelAttribute与@RequestBody的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-11-11


最新评论