参考
- https://blog.51cto.com/maxiaobian/3005329
- https://blog.youkuaiyun.com/qq_35190492/article/details/108256452
SPI是什么
- Service Provider Interface服务提供者接口
- 一种服务发现机制
- 通过加载配置文件中指定类
- 一般用于框架扩展使用。在不侵入框架的情况下,通过约定(加载配置文件中指定类),扩展框架功能
java
- META-INF/services/类名
- META-INF/services/com.github.kongwu.spisamples.SuperLoggerConfiguration:
- com.github.kongwu.spisamples.XMLConfiguration
- 加载工具类:java.util.ServiceLoader
- 实例:数据库驱动接口
- 有多个实现的情况下,取最后一个
- 最后一个是靠ClassPath的顺序确定的,不好
- 缺点:
- 无法按需加载,它会实例化所有实现
- 无法确定/指定加载某一个实现
Dubbo
- META-INF/dubbo/接口全限定名
- optimusPrime = org.apache.spi.OptimusPrime
- bumblebee = org.apache.spi.Bumblebee
- @SPI,不是同一个例子
- 使用
- 优点
- 可以指定某个类:通过别名
- 自适应扩展 SPI
spring
- META-INF/spring.factories,一个配置文件而不是一个接口一个配置文件
-
Logging Systems
- org.springframework.boot.logging.LoggingSystemFactory=\
- org.springframework.boot.logging.logback.LogbackLoggingSystem.Factory,\
- org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.Factory,\
- org.springframework.boot.logging.java.JavaLoggingSystem.Factory
-
PropertySource Loaders
- org.springframework.boot.env.PropertySourceLoader=\
- org.springframework.boot.env.PropertiesPropertySourceLoader,\
- org.springframework.boot.env.YamlPropertySourceLoader
-
- 目前主要用在spring boot