手把手教你写SpringBoot插件01SPI规范

编程

1、什么是SPI


这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service提供者接口;我对SPI的定义:提供给服务提供厂商与扩展框架功能的开发者使用的接口。

很多框架都使用了java的SPI机制,如JDBC4中的java.sql.Driver的SPI实现(mysql驱动、oracle驱动等)、common-logging的日志接口实现、dubbo的扩展实现等等框架;

2、如何编写SPI


当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 
基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。 
JDK提供服务实现查找的一个工具类:java.util.ServiceLoader。

3、SpringBoot的SPI规范

SpirngBoot 启动的时候会去扫码Jar包里面的META-INF/spring.factories文件,如下图

在SpringBoot启动时会筛选出META-INF/spring.factories 文件中实现 ApplicationContextInitializer 与 ApplicationListener的类

如Spring-boot 包中我们可以看到实现ApplicationContextInitializer 与ApplicationListener 的子类

如ServerPortInfoApplicationContextInitializer,实现ApplicationContextInitializer 的initialize方法,当Spring实例化bean的过程中会调用initilize方法

简单的说当我们要写一个SpringBoot使用的插件时,我们只要编写一个实现ApplicationContextInitializer 的子类,并且在resources/META-INF/spring.factories 编写好规范,那么Spring 启动时就会调用我们的子类的initialize方法。

以上是 手把手教你写SpringBoot插件01SPI规范 的全部内容, 来源链接: utcz.com/z/517492.html

回到顶部