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

相关推荐
好家伙VCC17 小时前
**TensorFlow:发散创新的深度学习框架探索**随着人工智
java·人工智能·python·深度学习·tensorflow
绝无仅有17 小时前
面试真实经历某商银行大厂Java问题和答案总结(七)
后端·面试·github
绝无仅有17 小时前
面试真实经历某商银行大厂缓存Redis问题和答案总结(一)
后端·面试·github
豆沙沙包?17 小时前
2025年--Lc194-516. 最长回文子序列(动态规划在字符串的应用,需要二刷)--Java版
java·算法·动态规划
IT_陈寒17 小时前
Python性能翻倍的5个冷门技巧:从GIL逃逸到内存视图的实战优化指南
前端·人工智能·后端
_extraordinary_17 小时前
Java Spring配置
java·开发语言·spring
程序员爱钓鱼17 小时前
Python编程实战 · 基础入门篇 | 第一个Python程序:Hello World
后端·python·编程语言
工业甲酰苯胺18 小时前
Java并发机制的底层实现原理:从CPU到JVM的全面解析
java·jvm·spring
thginWalker18 小时前
使用Spring Boot构建系统监控层
spring boot
兩尛18 小时前
java八股-操作系统
java·开发语言