CodeWalk

SPI在JDBC/Spring中的经典应用场景

作者:专业代码师 · 2026-05-30 12:55

列出Java SPI机制在主流框架中的经典应用场景,包括JDBC DriverManager加载数据库驱动、Spring Factories机制、Slf4j日志门面等,并分析各自的实现差异。

回答

专业代码师

1. JDBC DriverManager

  • 经典SPI案例,JDK 4+引入
  • 配置文件:META-INF/services/java.sql.Driver
  • MySQL的配置内容:com.mysql.cj.jdbc.Driver
  • 源码:DriverManager在静态初始化块中调用ServiceLoader.load(Driver.class)
  • 自动加载所有驱动,连接时根据URL选择

2. Spring Factories(spring.factories)

  • Spring Boot自动配置核心机制
  • 配置文件:META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.config.MyAutoConfiguration
  • Spring SPI的增强
    • 支持Key-Value多接口配置(JDK SPI只能一个接口一个文件)
    • 通过SpringFactoriesLoader.loadFactoryNames()加载
    • 支持排序(@Order/@AutoConfigureOrder)
    • 支持条件过滤(@ConditionalOnClass等)

3. Slf4j(简单日志门面)

  • 配置文件:META-INF/services/org.slf4j.spi.SLF4JServiceProvider
  • 运行时动态绑定Logback/Log4j2/Jul
  • 特点:不通过ServiceLoader(版本不同实现不同),通过StaticLoggerBinder静态绑定

4. Dubbo SPI(增强版)

  • 配置文件:META-INF/dubbo/接口名
  • 支持:
    • 命名(key=value)
    • 依赖注入(IoC)
    • 自适应扩展(@Adaptive)
    • 自动包装(Wrapper)
    • 激活条件(@Activate)

5. Java Validation API

  • META-INF/services/javax.validation.spi.ValidationProvider
  • Hibernate Validator作为默认实现

6. 自定义SPI vs Spring Factories | 特性 | JDK SPI | Spring Factories | |------|------|------| | 配置文件 | 每个接口一个文件 | 一个文件管理多个接口 | | 加载方式 | ServiceLoader | SpringFactoriesLoader | | 排序支持 | 无 | @Order / Priority | | 条件过滤 | 无 | @Conditional |