java spi机制和场景

 JDK中查找服务的实现的工具类是:java.util.ServiceLoader, jvm启动时自动查找META-INF/services/下面的实现类,并初始化实例

jdbc的mysql实现类 在静态代码块中完成自动注册到DriverManager

代码中可以直接使用DriverManager.getConnection来获取连接。

DriverManager的静态代码块会自动调用ServiceLoader.load(Driver.class) , 来加载mysql的驱动。但是这个加载也是从DriverManager.getConnection使用的时候才触发加载

如果手动实现spi,还是要在某个地方调用ServiceLoader.load(xxx.class)

代码不需要手动指定Driver所在的package,不用手动调用Class.forName("xxxx.xxx.xxx.XxDriver") 因为上面SPI已经帮我们执行了static代码

一个最简单的jdbc示例

 1     public static void main(String[] args) {
 2         try (Connection connection = DriverManager.getConnection("jdbc:mysql://xxx:3306/xxdb?useSSL=true", "root", "1111")){
 3             Statement statement = connection.createStatement();
 4             ResultSet res = statement.executeQuery("select now() from dual");
 5             while(res.next()){
 6                 Timestamp timestamp = res.getTimestamp(1);
 7                 System.out.println(timestamp);
 8             }
 9         } catch (SQLException e) {
10             e.printStackTrace();
11         }
12     }

@see 

https://cxis.me/2017/04/17/Java%E4%B8%ADSPI%E6%9C%BA%E5%88%B6%E6%B7%B1%E5%85%A5%E5%8F%8A%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/

dubbo

spring.datasource.driver-class-name 不需要配置,但是它会根据url匹配出相应的driver,没有使用SPI

原文地址:https://www.cnblogs.com/yszzu/p/9599051.html