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

相关推荐
一个天蝎座 白勺 程序猿1 分钟前
飞算JavaAI进阶:重塑Java开发范式的AI革命
java·开发语言·人工智能
代码的余温3 分钟前
Spring Boot集成Logback日志全攻略
xml·spring boot·logback
全干engineer4 分钟前
Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
后端·python·flask·web
前端 贾公子4 分钟前
tailwindCSS === 使用插件自动类名排序
java·开发语言
没有bug.的程序员10 分钟前
JAVA面试宝典 -《Spring Boot 自动配置魔法解密》
java·spring boot·面试
William一直在路上24 分钟前
SpringBoot 拦截器和过滤器的区别
hive·spring boot·后端
hnlucky40 分钟前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
hnlucky41 分钟前
同时部署两个不同版本的tomcat要如何配置环境变量
java·服务器·http·tomcat·web
小马爱打代码1 小时前
Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
spring boot·后端·微服务
旷世奇才李先生2 小时前
奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
spring boot·面试·java-rabbitmq