当前位置: 首页 > news >正文

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接口

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

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

        <!--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包

        <dependency><groupId>com.jdbc</groupId><artifactId>JDBCModule</artifactId><version>1.0-SNAPSHOT</version></dependency>

定义JdbcService的实现类

package com.mysql;
import com.jdbc.JdbcService;/*** @Author * @Date 2024/5/23 21:41*/
public class MySqlServiceImpl implements JdbcService {@Overridepublic 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接口的实现

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();}}
}
这是Oracle...
这是Mysql...Process finished with exit code 0

总结

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

相关文章:

  • 谓词逻辑(一)
  • Vue3:可以使用.value获取ref()包裹的值,为何还要存在unref()
  • 基于Vue3 + js-tool-big-box工具库实现3个随机数字的小游戏动画,快来挑战你的非凡手气!
  • 列表的创建和删除
  • 别说废话!说话说到点上,项目高效沟通的底层逻辑揭秘
  • 。。。。。
  • 面试八股之MySQL篇2——索引篇
  • 31.@Anonymous
  • 运行Android项目时,提示错误: 程序包javax.annotation.processing不存在
  • PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?
  • 组播协议简介
  • javascript --对象构造器和class的区别
  • maven的tomcat运行不起来的解决方案
  • 当他们在说业务的时候,到底在说什么
  • 数据访问层设计_6.连接对象管理设计
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • HashMap ConcurrentHashMap
  • interface和setter,getter
  • Java反射-动态类加载和重新加载
  • Linux后台研发超实用命令总结
  • PermissionScope Swift4 兼容问题
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redash本地开发环境搭建
  • Vue 动态创建 component
  • Vue.js-Day01
  • win10下安装mysql5.7
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 订阅Forge Viewer所有的事件
  • 工作中总结前端开发流程--vue项目
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端临床手札——文件上传
  • 思否第一天
  • 小程序开发之路(一)
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 字符串匹配基础上
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • #Linux(权限管理)
  • (09)Hive——CTE 公共表达式
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原)本想说脏话,奈何已放下
  • (转) ns2/nam与nam实现相关的文件
  • (转)LINQ之路
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • // an array of int
  • ??在JSP中,java和JavaScript如何交互?
  • @Autowired 与@Resource的区别
  • @Bean, @Component, @Configuration简析
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现