iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java SPI简单应用案例详解
  • 378
分享到

Java SPI简单应用案例详解

2024-04-02 19:04:59 378人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

开篇 本文主要谈一下 Java SPI(Service Provider Interface) ,因为最近在看 dubbo 的相关内容,其中涉及到了 一个概念- Dubbo SPI,

开篇

本文主要谈一下 Java SPI(Service Provider Interface) ,因为最近在看 dubbo 的相关内容,其中涉及到了 一个概念- Dubbo SPI, 最后又牵扯出来了 JAVA SPI, 所以先从 Java SPI 开整。

正文

平常学习一个知识点,我们的常规做法是:

  • 是什么
  • 有什么用
  • 怎么用

这次我们倒着做,先不谈什么是 SPI 及其作用,来看下如何使用。

使用

1. 创建一个 maven 工程

在这里插入图片描述

2. 创建一个接口类以及实现类


// 接口
public interface HelloService {

    void sayHello();

}

// 实现类 1
public class HelloServiceImpl1 implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("hello impl1");
    }
}

// 实现类 2
public class HelloServiceImpl2 implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("hello impl2");
    }
}

3. 创建一个 META-INF/services 文件夹,并添加一个文件

在 classpath 下面创建一个META-INF/services目录,再在下面创建一个
以接口类全路径名 命名的文件
即:com.nimo.spidemo.service.HelloService

4. 在第三步创建的文件中写入如下内容

写入两个实现类的全路径名


com.nimo.spidemo.service.impl.HelloServiceImpl1
com.nimo.spidemo.service.impl.HelloServiceImpl2

5. 启动函数


public class App {

    public static void main(String[] args) throws ClassNotFoundException, sqlException {
        // 方式 一
        Iterator<HelloService> providers = Service.providers(HelloService.class);
        while(providers.hasNext()) {
            HelloService ser = providers.next();
            ser.sayHello();
        }

        System.out.println("-----------------分割线---------------");
		// 方式 二
        ServiceLoader<HelloService> load = ServiceLoader.load(HelloService.class);
        Iterator<HelloService> iterator = load.iterator();
        while(iterator.hasNext()) {
            HelloService ser = iterator.next();
            ser.sayHello();
        }
    }

}

运行结果如下:

hello impl1

hello impl2

-----------------分割线---------------

hello impl1

hello impl2

使用要素

针对上面的 demo,可以看出使用 Java SPI 的几个关键要素:

  1. 接口类,比如 HelloService
  2. 对应接口的实现类
    实现类必须携带一个不带参数的构造方法
  3. 文件夹 META-INF/services
    放置 classpath 目录下
  4. 以“接口全限定名”命名的文件
  5. 文件内容为接口实现类的全路径

主程序通过java.util.ServiceLoder扫描META-INF/services下的配置文件,然后会找到实现类的全限定名,最后把类加载到JVM

SPI 的作用

从上面的 demo 中可以看到,Java SPI 就是把某个接口的 指定实现类 (通过在指定文件配置的方式)给实例化出来了。

准确+官方的说:

SPI 是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。引入服务提供者就是引入了 spi 接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔。

~~~ 如果还是不懂就接着往下看⬇️

SPI 的应用场景

一个典型的案例就是 jdbc 。

数据库各大厂商(如Mysqloracle)会根据一个统一的接口规范( java.sql.Driver )开发各自的驱动实现逻辑。
客户端使用 jdbc 时不需要去改变代码,直接引入不同的 spi 接口服务即可。
例如 :
mysql 是 com.mysql.jdbc.Drive
Oracle 是 oracle.jdbc.driver.OracleDriver

一段熟悉的代码:

使用操作 mysql 数据库的前置工作:


 //1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWord);

当我们需要切到 oracle 数据库时,更改驱动为 oracle.jdbc.driver.OracleDriver, 最后修改连接信息【用户名,密码等】即可。

总结

Java SPI 是一种服务发现机制。它通过在 classPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件里所定义的类。

它的核心关键作用就是 扩展

其他应用场景:

  • 日志门面接口实现类加载
    SLF4J加载不同提供商的日志实现类
  • spring
    Spring中大量使用了 SPI,比如:对 servlet3.0 规范 ServletContainerInitializer 的实现、自动类型转换Type Conversion SPI(Converter SPI、FORMatter SPI)等
  • Dubbo
    Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口

其中 Dubbo 中的 SPI 是接下来研究的重点。

到此这篇关于Java SPI简单应用案例详解的文章就介绍到这了,更多相关Java SPI简单应用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java SPI简单应用案例详解

本文链接: https://www.lsjlt.com/news/134138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java SPI简单应用案例详解
    开篇 本文主要谈一下 Java SPI(Service Provider Interface) ,因为最近在看 Dubbo 的相关内容,其中涉及到了 一个概念- Dubbo SPI,...
    99+
    2024-04-02
  • Java SPI用法案例详解
     1.什么是SPI      SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接...
    99+
    2024-04-02
  • 详解Java实现简单SPI流程
    目录SPI标注注解SPI核心实现SPI的一些Class和扩展对象缓存获取扩展器ExtensionLoader扩展加载器构造方法获取SPI扩展对象创建扩展对象从Holder中获取获取扩...
    99+
    2023-03-02
    Java实现SPI Java SPI Java实现简单SPI
  • Java 使用maven实现Jsoup简单爬虫案例详解
    一、Jsoup的简介         jsoup 是一款Java 的HTML解析器,可直接解析某个UR...
    99+
    2024-04-02
  • Java利用SPI实现解耦的示例详解
    目录概述实现案例优势和不足概述 SPI的全称是服务提供接口,可以用其来启动框架的扩展和替换组件。 其本质是利用 接口实现+策略模式+配置文件来实现对实现类的动态加载。 在具体的使用中...
    99+
    2023-05-14
    Java SPI实现解耦 Java SPI解耦 Java 解耦
  • Python中的tkinter库简单案例详解
    目录案例一Label & Button 标签和按钮案例二Entry & Text 输入和文本框案例三Listbox 部件案例四Radiobutton 选择按钮案例五S...
    99+
    2024-04-02
  • Java注解的简单入门小案例
    目录快速了解注解Talk is cheap, show me the code.定义注解定义类处理注解类测试测试结果快速了解注解 我发现现在很多资料讲的都太过于详细了,但是我们可能仅...
    99+
    2023-05-14
    Java注解 注解简单 Java注解入门
  • java 爬虫详解及简单实例
    Java爬虫一、代码爬虫的实质就是打开网页源代码进行匹配查找,然后获取查找到的结果。打开网页:URL url = new URL(http://www.cnblogs.com/Renyi-Fan/p/6896901.html);...
    99+
    2023-05-31
    java 爬虫 ava
  • PHP创建简单RPC服务案例详解
    RPC 定义 RPC(Remote Procedure Call)即远程过程调用,指被调用方法的具体实现不在程序运行本地,而是在别的某个地方。主要应用于不同的系统之间的远程通信和相互...
    99+
    2024-04-02
  • 详解SPI在Dubbo中的应用
    目录一、概述二、JDK自带SPI2.1、代码示例2.2、简单分析三、SPI与双亲委派3.1、SPI加载到何处3.2、SPI是否破坏了双亲委派四、Dubbo SPI4.1、基本概念4....
    99+
    2024-04-02
  • Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
    一、前言 在当今互联网时代,应用程序越来越复杂,对于我们开发人员来说,如何实现高效的组件化和模块化已经成为了一个重要的问题。而 Java SPI(Service Provider Interface)机制,作为一种基于接口的服务发现机制,可...
    99+
    2023-08-17
    java SPI
  • Spi机制在Android开发的应用示例详解
    目录Spi机制介绍举个例子ServiceLoader.load在Android中的应用总结Spi机制介绍 SPI 全称是 Service Provider Interface,是一种...
    99+
    2022-11-13
    Android开发Spi机制 Android Spi
  • Java插件扩展机制之SPI案例讲解
    目录什么是SPI与 接口类-实现类 提供的RPC 方式有什么区别?假设我们需要实现RPC,是怎么做的?那RPC究竟跟SPI什么关系?SPI的应用场景怎么实现一个SPI?中间件是怎么实...
    99+
    2024-04-02
  • 简单的Python解密rsa案例
    目录⛳️ 本次反反爬实战案例背景⛳️ JS 代码扣取登录加密逻辑.js⛳️ 总结⛳️ 本次反反爬实战案例背景 本篇博客选择的案例是由 VX 好友提出,他希望有一篇博客能简单的介绍清楚...
    99+
    2024-04-02
  • Java之单例模式实现方案详解
      单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式。但是除了这两种方式,本文还会介绍其他...
    99+
    2024-04-02
  • Java DatabaseMetaData用法案例详解
    目录一 . 得到这个对象的实例二. 方法getTables的用法三. 方法getColumns的用法四、方法getPrimaryKeys的用法五、方法.getTypeInfo()的用...
    99+
    2024-04-02
  • Java Scanner用法案例详解
    一、Scanner类简介       Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前...
    99+
    2024-04-02
  • Java ConcurrentHashMap用法案例详解
    一、概念 哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表(hash table):根据设定的哈希函数H(k...
    99+
    2024-04-02
  • Java ArrayAdapter用法案例详解
          拖延症最可怕的地方就是:就算自己这边没有拖延,但对方也会拖延,进而导致自己这边也开始拖延起来!现在这个项目我这边已经是完...
    99+
    2024-04-02
  • Java Map.entry案例详解
       Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作