SPI机制

简介: SPI机制

概念

SPI ,全称为 Service Provider Interface(服务提供者接口),是一种服务发现机制。它通过在classpath路径下的META-INF/services文件夹查找文件,自动加载文件中所定义的类。

作用

比如在远程调用服务中,一个A服务调用B服务时,当B服务具备多个实例时,那A服务就不得不选择一种负载均衡算法进行调用,此时如果既有的负载均衡算法不能实现我们的需求,那么我们就不得不自己写一个这样的算法嵌入到原有的远程调用框架中。

那么,应当如何让使用方的算法轻松的嵌入到框架的调用逻辑中,就成了框架的设计者不得不考虑的问题。当然,我们知道在Spring中这些都不是事,比如框架里面有个接口叫Rule,然后使用者实现这个接口MyRule并且把这个Bean注入到Spring容器中,这时候选择负载均衡算法的时候判断Spring中有没有这样的Bean,有就使用它,没有就用框架里面默认的就OK~

public class Executor{
  @Autowired(required = false)
  private IRule rule = new DefaultRule();
  public void execute(){
    rule....
  }
}

以上代码纯手写

如果没有Spring的世界呢?

在Java中,提供了一种SPI机制,通过这种机制,我们可以用指定的类加载器去实例化出某一个接口下的实现类

为什么是指定的类加载器呢?

具体是怎么做的呢?

栗子

建一个工程,结构如下

provider 为服务提供方,可以理解为我们的框架

zoo 为使用方,因为我的服务提供接口叫Animal,所以所有实现都是动物~

pom.xml里面啥都没有

1. 定义一个接口

在provider模块中定义接口Animal

package cn.zijiancode.spi.provider;
/**
 * 服务提供者 动物
 */
public interface Animal {
    // 叫
    void call();
}

2. 使用该接口

在zoo模块中引入provider

<dependency>
  <groupId>cn.zijiancode</groupId>
  <artifactId>provider</artifactId>
  <version>1.0.0</version>
</dependency>

写一个小猫咪实现Animal接口

public class Cat implements Animal {
    @Override
    public void call() {
        System.out.println("喵喵喵~~");
    }
}

写一个狗子也实现Animal接口

public class Dog implements Animal {
    @Override
    public void call() {
        System.out.println("汪汪汪!!!");
    }
}

3. 编写配置文件

新建文件夹META-INF/services

在文件夹下新建文件cn.zijiancode.spi.provider.Animal

对,你没看错,接口的全限定类名就是文件名

编辑文件

cn.zijiancode.spi.zoo.Dog
cn.zijiancode.spi.zoo.Cat

里面放实现类

至于为啥这样做,别问,问就是规定

3. 测试

package cn.zijiancode.spi.zoo.test;
import cn.zijiancode.spi.provider.Animal;
import java.util.ServiceLoader;
public class SpiTest {
    public static void main(String[] args) {
        // 使用Java的ServiceLoader进行加载
        ServiceLoader<Animal> load = ServiceLoader.load(Animal.class);
        load.forEach(Animal::call);
    }
}

测试结果:

汪汪汪!!!
喵喵喵~~

整个项目结构如下:

原理分析

其实这里面涉及的原理不难猜想:SeviceLoader根据规则读取出文件中的内容,然后逐一实例化就行

小结

看完本篇内容,相信大家已经明白了什么是SPI已经如何使用它,简单回顾一下

  • SPI: 服务提供者接口,是一种服务发现机制
  • 意义:框架或者服务提供者本身可以不实现内容自定义规范,由使用者进行实现:如 java.sql.Driver

问题:如果细心一点的话可以发现,这个SPI机制是可以允许多个实现的,如我们的狗子和猫咪,那么,如果我们需要在众多的实现中选择一个实现,应当如果做呢?

原生的JavaSPI机制是做不到的,但是Dubbo给我们实现了一个这样的类加载器ExtensionLoader

更多的内容就由小伙伴自行探索啦~

目录
相关文章
|
传感器
STM32--TIM定时器(1)
STM32--TIM定时器(1)
923 0
|
缓存 网络协议 数据安全/隐私保护
[运维笔记] - (命令).Windows server常用网络相关命令总结
[运维笔记] - (命令).Windows server常用网络相关命令总结
796 0
|
5月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
509 57
|
弹性计算 固态存储 Linux
阿里云服务器、轻量应用服务器、gpu云服务器收费标准与实时活动价格参考
云服务器ECS、轻量应用服务器和gpu云服务器是阿里云的主要云服务器产品,目前轻量应用服务器2核2G收费标准为60元/月,活动价格只要36元/1年或68元1年,云服务器1核1G包月收费标准最低为24.0元/月,GPU云服务器中gn6i实例4核15G配置月付1681.00/1个月起,gn6v实例8核32G配置月付3817.00/1个月起。本文为大家整理汇总了阿里云服务器、轻量应用服务器、gpu云服务器的最新收费标准与活动价格情况,以表格形式展示给大家,以供参考。
|
10月前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
390 16
|
Linux 开发工具
详尽分享离线安装telnet
详尽分享离线安装telnet
1890 3
|
机器学习/深度学习 算法 开发工具
大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践
阿里云的人工智能平台PAI,作为一站式的机器学习和深度学习平台,对DPO算法提供了全面的技术支持。无论是开发者还是企业客户,都可以通过PAI-QuickStart轻松实现大语言模型的DPO对齐微调。本文以阿里云最近推出的开源大型语言模型Qwen2(通义千问2)系列为例,介绍如何在PAI-QuickStart实现Qwen2的DPO算法对齐微调。
|
项目管理 数据安全/隐私保护
GitLab中用户的五种权限 Guest、Reporter、Developer、Master、Owner
GitLab中用户的五种权限 Guest、Reporter、Developer、Master、Owner
|
机器学习/深度学习 算法 安全
2024.3.20隐语训练营第3讲笔记:详解隐私计算框架及技术要点
隐语架构是一个分层设计,支持不同技术路线,确保高内聚、低耦合,增强开放性。它包括产品层(如SecretPad和SecretNote)、算法层(如PSI和PIR协议)、计算层(RayFed和SPU)、资源层(KUSCIA)和互联互通及跨域管控机制。该架构旨在提供高性能、易用的隐私计算解决方案,支持MPC、TEE、SCQL等,并允许不同背景的研究人员参与。
466 0
|
安全 Unix Linux
第一章 操作系统概述
第一章 操作系统概述
838 0

热门文章

最新文章