手把手教你写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