什么是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
|