SPI机制

什么是SPI?

SPI 即 Service Provider Interface(服务提供者的接口),服务提供者来实现这个接口,从而实现无需修改源代码,扩展程序、解耦的效果。

很多框架都使用了 Java 的 SPI 机制,比如:Spring 框架、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等

API和SPI区别

API:由实现方定义和实现具体内容

SPI:由调用方实现具体内容,实现方定义具体接口

img

实现方式

  1. JDK中的 ServiceLoader

    需要在项目路径下MATE-INF/services文件目录下,创建以接口全路径的文件名的文件,实现类全路径为内容,以行为分割。

    缺点:虽然是懒实例化,但是不管你使用不使用都会给你把class对象加载进来

  2. JDBC中的 SPI

    image-20240101115228663

    当我们去使用JDBC的时候,会去加载驱动类,但是我们必须指定的实现类,这种也是SPI的体现

    1
    2
    3
    4
    5
    6
    // 加载 MySQL 驱动程序
    Class.forName("com.mysql.cj.jdbc.Driver");

    // 获取数据库连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "username", "password");

  3. spring boot中的 factorys

    在spring 中的META-INF目录下创建spring.fatories文件, 也是spring boot starter的原理

    1
    2
    3
    接口全路径=\
    具体实现类1,\
    具体实现类2...