这个SPI机制非常简单,如果手写过SpringBoot的starter机制,立马就能理解
是什么:SPI机制,简单地说,就是我提供一个接口,多个人提供实现
好处:
- 让系统变得更加灵活,比如JDBC,可以根据自己的需要,动态选择驱动类型
- 让配置变得简单,比如Springboot的自动配置原理,将第三方默认的配置类加载进来
具体代码(以Java注册数据库驱动为例):
- 我们写JDBC代码的时候,第一步绝对是注册驱动,就是Class.forName,但是为什么仅仅反射创建一个类就实现了注册驱动
- 点开Class.forName加载的Driver,会发现Driver类中静态代码块执行了一个方法,就是让DriverManager类中将Driver注册到DriverManager中
真正核心的地方:
- 点开DriverManager类中的静态代码块,会发现它使用了SPI机制。使用ServiceLoader.load去加载META-INF/service目录下的文件,加载规则是文件名作为接口,文件内容是实现类。比如发现有个文件叫做java.sql.Driver,文件内容为com.mysql.cj.jdbc.Driver
- 然后打开mysql-connact-java.jar,打开META-INF/service文件夹,你会发现确实是这样
SpringBoot是如何借鉴的:
springboot会自动加载META-INF/spring.factories文件中,key为EnableAutoConfiguration的配置类