Java SPI 实例

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。

这里简单写一个例子示意

创建DemoService接口 如下

 1 package com.demo;
 2
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public interface DemoService {
 8
 9     void sayHello();
10
11 }

创建两个实现类如下

Demo1Service
 1 package com.demo;
 2
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public class Demo1Service implements DemoService {
 8
 9     @Override
10     public void sayHello() {
11         System.out.println("hello  I am Demo1Service");
12     }
13 }

Demo2Service

 1 package com.demo;
 2
 3 /**
 4  * @author chaixg
 5  * 2019/1/25
 6  */
 7 public class Demo2Service implements DemoService {
 8
 9     @Override
10     public void sayHello() {
11         System.out.println("hello  I am Demo2Service");
12     }
13 }

java SPI 读取 META-INF/services/{接口名} 此目录 创建com.demo.DemoService文件,写上实现类 如下

1 com.demo.Demo1Service
2 com.demo.Demo2Service

创建测试类Main方法调用

 1 package com.demo;
 2
 3 import java.util.ServiceLoader;
 4
 5 /**
 6  * @author chaixg
 7  * 2019/1/25
 8  */
 9 public class Demo {
10
11     public static void main(String[] args) {
12
13         ServiceLoader.load(DemoService.class).forEach(DemoService::sayHello);
14     }
15 }

执行结果如下

在文件中写上哪些实现类 这里就会获取到哪些实现类的实例

我们就可以利用JDK提供的这一功能特性来做到动态给接口替换实现类 dubbo框架就利用了这一特性作为框架基础 不过Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。有兴趣者可以查看dubbo的实现

over...

原文地址:https://www.cnblogs.com/jasonChai/p/10319292.html

时间: 2024-11-05 21:53:54

Java SPI 实例的相关文章

Java SPI(Service Provider Interface)

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制. 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说,有个接口,想运行时动态的给它添加实现,你只需要添加一个实现. 当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类.当其他的程序需要这个服务的时候,就可以通过查

JAVA SPI机制分析

简介 SPI的全名为Service Provider Interface,主要是应用于厂商自定义组件或插件中.在java.util.ServiceLoader的文档里有比较详细的介绍.简单的总结下java SPI机制的思想:我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块.xml解析模块.jdbc模块等方案.面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码.一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码.为

Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI

SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实现,而是在外部进行装配. 要想了解 Dubbo 的设计与实现,其中 Dubbo SPI 加载机制是必须了解的,在 Dubbo 中有大量功能的实现都是基于 Dubbo SPI 实现解耦,同时也使得 Dubbo 获得如此好的可扩展性. Java SPI 通过完成一个 Java SPI 的操作来了解它的机

Flex Socket与Java通信实例说明(转)

Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注释,也注释了很多. 跟着走你就会懂.. Flex端 和 Java端, 先运行Java端启动服务.然后在测试Flex. 实例一: Flex端: <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow

java编程实例

脚本代码: 1. [代码] package com.gufengxiachen.sthreadchatapp;/** * @author GUXIA */import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Outpu

【JAVA】使用Java SPI ServiceLoader进行Java应用插件模块化开发

背景:在进行业务定制时需要考虑不同接口的服务实现,每个局点所要求的接口大体都不一致,要求接口服务能够插件化方式提供: 方案分析: 1)采用OSGI框架进行开发,但是考虑到OSGI的框架太重,需要引入的东西比较多,放弃了该方案: 2)采用Java class loader动态加载外部jar机制,动态加载定制的接口服务类,这种方式实现比较复杂,需要完成指定接口服务类的文件加载,同时需要能查找到所有接口服务类,作为备选方案: 3)使用java service provider interface(SP

Java多线程-实例解析

Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法.2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法.3.实现Callable接口,重写call方法.Callable接口与Ru

截取指定长度字节数后的字符串(Java方法实例,注:同样思路js也适用)

可能之前是习惯了上网查看其他人的资料,当我遇到这样的问题的时候,我第一时间想到的就是上网查个现成的方法直接用:可是查阅网上各大论坛以及其他资料之后,发现大部分人都是照搬其他人的,这种情况很严重,而且个人感觉很不利于个人技术的成长:当然更重要的原因是,我感觉网上的大部分方法都把问题给复杂化了,无论是用js方法截取还是通过封装Java类,都感觉繁琐了些:为此我自己写了个相对来说较为简单的方法,其实很简单的思路和方法就能实现,下面奉上我自己的方法,希望大家多多指正不足之处(支持全角输入的字符和汉字等,

Java 注解实例

package com.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; /** * * @author cong * 数据库连接注解 * */ @Target(val