Spi机制的必要性

SpringBoot 为啥单独加载类路径下spring.factories文件中的类?

SpringBoot 应用运行过程中存在两种类型的类初始化:一部分为已经提前装载到IOC容器中的bean,另一部分则为实时new的bean。

IOC容器中的bean包含:启动类所在包路径下全部的类 以及 spring.factories文件中的类。

类路径下的类并非全部需要加载到JVM中,简单理解为主动使用的类才会被加载到JVM中。spring.factories文件中的类对所有jar包中的类启动选择作用,只有位于spring.factories文件中指定jar中的类才会被加载IOC容器中,当然这些类运行过程中还有通过new方法、反射方式实例化jar包中的其他类。


为什么会存在Spi机制呢?

只是为了框架中实现灵活的扩展。如果没有Spi机制则需要显式写死实现类,后期扩展改动比较麻烦。


在配置数据库相关属性时存在以下选项:

sql 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/folder?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root

其中driver-class-name会触发SPI机制加载Driver的实现类。

mysql-connector-java是MySQL提供实现了JDBC定义的驱动(JDBC是一种规范,定义了Java语言如何去操作数据库,也就是实现相关API,是一种接口规范。mysql-connector-java是MySQL提供实现的JDBC定义的驱动),是Java程序中真正操作MySQL数据库的客户端。简单来说mysql-connector-java允许了通过Java访问MySQL。

spring-boot-starter-jdbc,是Spring提供的,它基于mysql-connector-java,又进行了封装,使得代码更加简单。也就是mysql-connector-java提供的是JDBC,而spring-boot-starter-jdbc提高了简化版的JDBC------JdbcTemplate。

mybatis-spring-boot-starter是Mybatis操作数据库层面的封装。

HikariConfig即HikariCP包中的类:基于上述driver-class-name配置实例化对应接口Driver的实现类

复制代码
public class HikariConfig implements HikariConfigMXBean{

   private String driverClassName;

   public void setDriverClassName(String driverClassName){
      Class<?> driverClass = null;
      ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader();
      driverClass = threadContextClassLoader.loadClass(driverClassName);
      driverClass.newInstance();
      this.driverClassName = driverClassName;
   } 

}
复制代码
mysql-connector-java.jar之com.mysql.jdbc.Driver:
sql 复制代码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        java.sql.DriverManager.registerDriver(new Driver());
    }
}
相关推荐
AI人工智能+电脑小能手4 分钟前
【大白话说Java面试题 第190题】【08_Kafka篇】第6题:消息队列有什么作用?
java·kafka·消息队列·系统设计·分布式架构
蚰蜒螟14 分钟前
一次 Spring AOP 与定时任务引发的死锁排查实录
java·spring·firefox
TeamDev14 分钟前
JxBrowser 9.3.1 版本发布啦!
java·前端·javascript·c#·混合应用·jxbrowser·浏览器控件
程序猿乐锅1 小时前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
yeflx1 小时前
速腾Airy雷达使用记录
java·服务器·网络
乐之者v1 小时前
AI编程 -- Agents.md 的简单示例
java·ai编程
无风听海2 小时前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
geovindu2 小时前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
listening7772 小时前
HarmonyOS 6.1 元服务深度优化:从“秒开”到“常驻”的极致体验
java·开发语言·spring
AC赳赳老秦3 小时前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw