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

相关推荐
zhanggongzichu12 分钟前
小白怎么理解后端分层概念
后端·全栈
鬼蛟26 分钟前
Spring————事务
android·java·spring
西门吹-禅1 小时前
【sap fiori cds up error】
java·服务器·sap cap cds
stark张宇1 小时前
Golang后端面试复盘:从Swoole到IM架构,如何支撑360w用户的实时消息推送?
后端
小码哥_常1 小时前
从0到1:搭建Spring Boot 3企业级认证授权平台
后端
敲代码的嘎仔1 小时前
Java后端面试——SSM框架面试题
java·面试·职场和发展·mybatis·ssm·springboot·八股
小码哥_常1 小时前
告别扫库噩梦!Spring Boot+Redis让订单超时管理飞起来
后端
大傻^2 小时前
Spring AI Alibaba RAG实战:基于向量存储的检索增强生成
java·人工智能·spring
大傻^2 小时前
Spring AI Alibaba 快速入门:基于通义千问的AI应用开发环境搭建
java·人工智能·后端·spring·springai·springaialibaba
伯恩bourne2 小时前
Google Guava:Java 核心工具库的卓越之选
java·开发语言·guava