Spring Boot 加载扩展的原理

Posted by icoding168 on 2020-04-08 15:44:01

分类: Java  

用 Spring Boot 整合其它类库或框架很方便,一般在 pom 文件中加对应的 starter 依赖就搞定了。对于 Spring Boot 来说,这些类库或框架其实就是 Spring Boot 的扩展,Spring Boot 是利用 SPI 机制来加载扩展的。

SPI 全称为 Service Provider Interface,是 JDK 内置的一种服务发现机制。SPI 是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供扩展功能。

在 JDBC 4.0 之前,连接数据库的时候,通常会用 Class.forName() 方法先加载数据库相关的驱动,然后再进行获取连接等的操作。而 JDBC 4.0 之后不需要用 Class.forName 来加载驱动了,直接获取连接即可,这也是使用了 Java 的 SPI 机制来实现。

String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url,username,password);

Spring Boot、Dubbo 等框架都使用 SPI 机制来加载扩展,不过这些框架没有直接使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。