Spring中SPI的使用

什么是SPI

SPI 全程叫 Service Provider Interface 服务提供接口,它可以通过一个指定的接口 / 抽象类,寻找到预先配置好的实现类(并创建实现类对象)。

Spring 通过 SpringFactoriesLoader 读取放在 META-INF 目录下名为 spring.factories 的文件,获取文件中的权限定类名转化为实体对象。

spring.factories

1
2
3
com.eitan.spring.spi.dao.DemoDao=\
com.eitan.spring.spi.daoImpl.MysqlDemoDao,\
com.eitan.spring.spi.daoImpl.OracleDemoDao

接口和实现类

1
2
3
4
5
6
7
8
public interface DemoDao {
}

public class MysqlDemoDao implements DemoDao {
}

public class OracleDemoDao implements DemoDao {
}

SpringApplication

1
2
3
4
5
6
7
8
9
public class SpringApplication {
public static void main(String[] args) {
List<DemoDao> demoDaoList = SpringFactoriesLoader.loadFactories(DemoDao.class, SpringApplication.class.getClassLoader());
demoDaoList.forEach(System.out::println);

List<String> factoryNames = SpringFactoriesLoader.loadFactoryNames(DemoDao.class, SpringApplication.class.getClassLoader());
factoryNames.forEach(System.out::println);
}
}

运行结果

1
2
3
4
com.eitan.spring.spi.daoImpl.MysqlDemoDao@f2a0b8e
com.eitan.spring.spi.daoImpl.OracleDemoDao@593634ad
com.eitan.spring.spi.daoImpl.MysqlDemoDao
com.eitan.spring.spi.daoImpl.OracleDemoDao