SpringBoot前置知识01-SPI接口

SpringBoot前置知识-SPI接口

介绍

Java中SPI是一种服务发现机制,或者说是一种思想,亦是一种约定。其实JDK中的JDBC就是使用了这种用思想,JDBC在JDK中只定义了接口,并没有实现类,连接什么数据库就要引入什么数据库的驱动。
SPI通过在ClassPath路径下的META-INF/services文件夹下通过创建文件实现服务注册,文件名为要实现接口的全限定名,内容为实现类的全限定名。

实践

分别创建三个maven项目JDBCModule,MySQLModule,OracleModule,其中MySQLModule,OracleModule实现JDBCModule中的JdbcService接口

JDBCModule

创建一个JdbcService接口

java 复制代码
package com.jdbc;
/**
 * @Author 
 * @Date 2024/5/23 21:38
 */
public interface JdbcService {
    void connection();
}

pom文件中引入MySQLModule,OracleModule打成的jar包

xml 复制代码
        <!--oracle实现jdbc接口-->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>OralceModule</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--MySQL实现jdbc接口-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>MySqlModule</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
MySQLModule

引入JDBCModule打成的jar包

xml 复制代码
        <dependency>
            <groupId>com.jdbc</groupId>
            <artifactId>JDBCModule</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

定义JdbcService的实现类

java 复制代码
package com.mysql;
import com.jdbc.JdbcService;

/**
 * @Author 
 * @Date 2024/5/23 21:41
 */
public class MySqlServiceImpl implements JdbcService {
    @Override
    public void connection() {
        System.out.println("这是Mysql...");
    }
}

在resources目录下创建MATE-INF文件夹,在MATE-INF文件夹下创建文件夹命名为要实现接口的权限的名,当前项目下即JdbcService的全限定名 com.jdbc.JdbcService

内容为实现类的全限定名,即MySqlServiceImpl的全限定名com.mysql.MySqlServiceImpl。这样,接口就能知道实现类了。

OracleModule

和MySQLModule同理

使用

这样在JDBCModule中就可以找到实现类了,或者将JDBCModule打成jar包引入到其他项目中也可以找到接口的实现类了。通过ServiceLoad加载SPI接口的实现

java 复制代码
public class AppMain {
    public static void main(String[] args) {
        ServiceLoader<JdbcService> load = ServiceLoader.load(JdbcService.class);
        Iterator<JdbcService> iterator = load.iterator();
        while (iterator.hasNext()){
            iterator.next().connection();
        }
    }
}
shell 复制代码
这是Oracle...
这是Mysql...

Process finished with exit code 0

总结

SpringBoot的核心思想是"约定大于配置",由此可以看出Spring发展为SpringBoot是必然结果。技术在变,但是思想不会变。

相关推荐
不懂的浪漫5 分钟前
mqtt-plus 架构解析(五):错误处理与 ErrorAction 聚合策略
java·spring boot·后端·物联网·mqtt·架构
呼啦啦56111 分钟前
C++vector
java·c++·缓存
花千树-01012 分钟前
MCP + Function Calling:让模型自主驱动工具链完成多步推理
java·agent·react·mcp·toolcall·harness·j-langchain
Benszen15 分钟前
Linux容器:轻量级虚拟化革命
java·linux·运维
凸头19 分钟前
Lombok 包底层浅析
java
不懂的浪漫21 分钟前
mqtt-plus 架构解析(三):Payload 序列化与反序列化,为什么要拆成两条链
java·spring boot·物联网·mqtt·架构
卷福同学26 分钟前
去掉手机APP开屏广告,李跳跳2.2下载使用
java·后端·算法
漫霂37 分钟前
二叉树的翻转
java·数据结构·算法
语戚37 分钟前
力扣 51. N 皇后:基础回溯、布尔数组优化、位运算全解(Java 实现)
java·算法·leetcode·力扣·剪枝·回溯·位运算
程序猿阿越1 小时前
Kafka4源码(三)Share Group共享组
java·后端·源码阅读