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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java超详细的学习笔记】Java超详细的学习笔记,适合小白入门,Java语法学习,Java开发学习笔记,Java入门学习笔记

一&#xff0c;Java初学者学习笔记 Java超详细的学习笔记&#xff0c;点击我获取 1&#xff0c;Java基础语法 一个 Java 程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#…

碳课堂|ISO 14067 产品碳足迹国际标准

为规范评估产品碳排放&#xff0c;国际标准化组织发布了《ISO14067&#xff1a;2018温室气体-产品碳足迹-量化要求及指南》&#xff0c;标准量化产品生命周期阶段&#xff08;包括从资源开采、原材料采购到产品的生产、使用和报废阶段&#xff09;的温室气体排放的通用标准。该…

赶紧收藏!2024 年最常见 20道 Redis面试题(四)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;三&#xff09;-CSDN博客 七、Pipeline有什么好处&#xff0c;为什么要用pipeline&#xff1f; Redis Pipeline 是一种批量执行命令的技术&#xff0c;它允许客户端一次性发送多个命令…

功耗相关总结

文章目录 功耗相关的使用场景MCU中低功耗的应用RTOS中低功耗应用 功耗相关的使用场景 目前越来越多的嵌入式设备采用电池进行供电&#xff0c;而不是跟台式电脑一样&#xff0c;可以一直连接着电源。在电池供电的场景下&#xff0c;对功耗的要求很高&#xff0c;工程师们尽量希…

炫酷gdb

在VS里面调试很方便对吧&#xff1f;&#xff08;F5直接调试&#xff0c;F10逐过程调试--不进函数&#xff0c;F11逐语句调试--进函数&#xff0c;F9创建断点&#xff09;&#xff0c;那在Linux中怎么调试呢&#xff1f; 我们需要用到一个工具&#xff1a;gdb 我们知道VS中程…

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间 遇到两个维度权衡的时候&#xff0c;一定要先确定一个维度&#xff0c;再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。 重叠区间问题 435. 无重叠区间 题目链接 435 给定一个区间的集合 i…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”&#xff0c;这意味着我们必须正确解释该术语&#xff0c;我们会这样做&#xff0c;但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道&#xff0c;DevOps 没有明确的定义。是的。 大多数情况下&a…

07. 哨兵模式

文章目录 概述哨兵模式多哨兵模式测试哨兵模式优缺点哨兵模式的配置 概述 主从切换的技术是&#xff0c;当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这需要人工干预&#xff0c;还会造成一段时间内服务不可用。所以我们考虑使用哨兵模式。…

安卓实现5个底部导航栏切换fragment

步骤&#xff0c;写 5 个 fragment 自定义的类5个布局文件&#xff1a; package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功&#xff1b; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符&#xff1b; 等待下载完成 4.到…

Web安全:企业如何抵御常见的网络攻击?

近年来随着人类社会向数字世界的加速发展&#xff0c;勒索软件攻击事件在全球范围内呈现快速上升的态势&#xff0c;几乎所有国家的政府、金融、教育、医疗、制造、交通、能源等行业均受到影响&#xff0c;可以说有互联网的地方就可能发生勒索软件攻击事件。 Web安全是一个大课…

蓝桥杯2023(十四届)省赛——统计日期(八重神子)

统计日期 2.日期统计 - 蓝桥云课 (lanqiao.cn) 其实一开始我想直接暴力的&#xff0c;然后写着写着突然觉得可以优化一下&#xff1a; 优化方法&#xff1a;先找所有2023的位置&#xff0c;记录初始和最后的位置 找出所有合法日期的位置&#xff0c;使用前缀和&#xff0c;计…

C语言基础-静态变量(static)

在C语言中&#xff0c;static关键字有多种用途&#xff0c;主要与变量的存储期&#xff08;lifetime&#xff09;和可见性&#xff08;visibility&#xff09;有关。以下是static在C语言中的主要用途&#xff1a; 局部静态变量&#xff1a; 在函数内部定义的局部静态变量&#…

2024-05-24 思考-关于软件架构设计

摘要: 2024-05-24 思考-关于软件架构设计 软件架构设计: 虽然在商业的战略中&#xff0c;软件代码只是起到最后的一个环节&#xff0c;但是对于业务本身来说&#xff0c;还是应该站在商业的视角上&#xff0c;去看待技术的实现此前读过的比较有价值的关于软件架构设计的书&…

【全开源】简单商城系统(PC/UniAPP)

轻松构建您的在线商店 在当今数字化时代&#xff0c;拥有一个在线商店对于许多商家来说已成为必不可少的营销手段。为了满足这一需求&#xff0c;我们推出了“简单商城系统源码”&#xff0c;让您轻松构建并管理您的在线商店。 一、简单易用&#xff0c;快速上手 “简单商城…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;常用于在客户端和服…

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果&#xff0c;项目demo演示如下所示&#xff1a; 项目解析&#xff1a; new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象&#xff0c;第一个参数传…

用python做的一个井子棋游戏——浔川python社

简介&#xff1a; 在井子棋的基础上&#xff0c;我们改进了登录界面。允许大量玩家注册! # -*- coding: utf-8 -*- import tkinter as tk import tkinter.messagebox import pickle import random# 窗口 window tk.Tk() window.title(欢迎进入python) window.geometry(450x2…

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活&#xff0c;正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

TypeScript中的类型推断(Type Inference):自动化的类型安全

TypeScript中的类型推断&#xff08;Type Inference&#xff09;&#xff1a;自动化的类型安全 引言 类型推断是TypeScript的一个关键特性&#xff0c;它允许编译器根据值的初始化或上下文自动推导出变量的类型。这减少了需要显式指定的类型注解&#xff0c;同时保持了代码的…