JAVA的SPI机制

参考资料:

参考视频

参考demo

CSDN的demo


简介:

概念

JDK SPI 是一种基于 ServiceLoader 的接口实现发现机制,它通过扫描 Jar 包中 META-INF/services 目录下的配置文件,动态加载接口实现类。

具体实现方式

JDK提供的Service类的providers方法或者ServiceLoader类的load方法,根据指定接口,遍历并发现,加载的JAR包中,resources目录下的META-INF/services文件夹中该接口的实现类信息;

在该文件夹下,存在文件,名称为接口的全限定名,内容为该接口实现类的全限定名,可以是多个;

在根据接口全限定名找到该接口的多个实现类全限定名后,将实现类加载到JVM中,可以使用迭代器等方式,遍历并执行接口的多种实现方式。

应用

该技术特点是,强解耦,热插拔的特点,广泛应用于java项目的JDBC连接等;

如java项目在数据库连接方面的处理:

首先,JDK会内置JDBC接口规范,并在JDK启动时,会扫描加载的JAR包中,是否有该接口的实现,如果有则逐个建立连接(如:MySQL、oracle等)。


具体搭建方式:

详情见参考demo

首先需要一个多model的项目

在第一个model中创建接口

java 复制代码
package org.example;

public interface JdbcInstall {
    public String install();
}

执行 mvn -install命令,并将依赖引入到第二个项目中

bash 复制代码
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>java-jdbc-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

然后在第二个项目中编写该接口的实现类

java 复制代码
package org.example.jdbcimpl;

import org.example.JdbcInstall;

public class JdbcImpl_01 implements JdbcInstall {

    @Override
    public String install() {
        return "MySQL驱动安装成功!!!";
    }
}
java 复制代码
package org.example.jdbcimpl;

import org.example.JdbcInstall;

public class JdbcImpl_02 implements JdbcInstall {

    @Override
    public String install() {
        return "Oracle驱动安装成功!!!";
    }
}
java 复制代码
package org.example.jdbcimpl;

import org.example.JdbcInstall;

public class JdbcImpl_03 implements JdbcInstall {

    @Override
    public String install() {
        return "SQL server驱动安装成功!!!";
    }
}

并创建resources/META-INF\services目录,添加文件,文件名为接口的全限定名,内容为实现类的全限定名

java 复制代码
org.example.jdbcimpl.JdbcImpl_01
org.example.jdbcimpl.JdbcImpl_02
org.example.jdbcimpl.JdbcImpl_03

执行 mvn -install命令,并将依赖引入到第三个项目中

java 复制代码
    <dependency>
      <groupId>org.example</groupId>
      <artifactId>java-jdbcimpl-use</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

并且编写代码,使用该接口

bash 复制代码
package org.example;

import sun.misc.Service;

import java.util.Iterator;
import java.util.ServiceLoader;

public class JbdcUse {
    public static void main(String[] args) {
        Iterator<JdbcInstall> providers = Service.providers(JdbcInstall.class);
        ServiceLoader<JdbcInstall> load = ServiceLoader.load(JdbcInstall.class);
        while(providers.hasNext()) {
            JdbcInstall ser = providers.next();
            System.out.println(ser.install());
        }
        System.out.println("--------------------------------");
        Iterator<JdbcInstall> iterator = load.iterator();
        while(iterator.hasNext()) {
            JdbcInstall ser = iterator.next();
            System.out.println(ser.install());
        }
    }
}

相关推荐
一 乐1 小时前
高校实习信息发布网站|基于Spring Boot的高校实习信息发布网站的设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·高校实习信息发布网站
weelinking1 小时前
【产品】11_实现后端接口——数据在背后如何流动
java·人工智能·python·sql·oracle·json·ai编程
摇滚侠1 小时前
东方通替换tomcat,实战经验
java
IT猿手1 小时前
多目标优化算法:多目标蛇优化算法(Multiple Objective Snake Optimizer,MOSO)(提供MATLAB代码)
开发语言·算法·matlab·动态路径规划·光伏模型参数估计
朔北之忘 Clancy1 小时前
2026 年 3 月青少年软编等考 C/C++ 一级真题解析
c语言·开发语言·c++·青少年编程·题解·考级
小成202303202651 小时前
C++~01面向对象基础
开发语言·c++
会编程的土豆2 小时前
Go 方法接收者超清晰笔记(类型名 vs 变量名)
开发语言·笔记·golang
utf8mb4安全女神2 小时前
【rsyslog服务】把所有服务的“临界点”以上的错误都保存在/var/log/alert.log⽇志中
java·前端·javascript
带刺的坐椅2 小时前
Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
java·http·solon·jetty·undertow