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是必然结果。技术在变,但是思想不会变。

相关推荐
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
phltxy9 小时前
C语言操作符详解
java·c语言·算法
步行cgn10 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
sunshine22 girl10 小时前
Java学习一 环境配置2 安装和基本使用Idea
java·学习·intellij-idea
嘿嘿-6611 小时前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
桦说编程11 小时前
【AtomicAgent系列1】变异测试——过去做不起,现在 agent 做得起
后端·ai编程·vibecoding
考虑考虑12 小时前
nginx打印请求日志
运维·后端·nginx
策案案案12 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
IT_陈寒13 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
CoderLiu13 小时前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端