SPI
SPI
SPI:Service Provider Interface,是
面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。在实际过程中,
SPI 缺陷
-
缺少实例的维护
ServiceLoader 每次load 后,都会生成一份实例,也就是我们理解的prototype ; -
无法获取指定的实例,在
Spring 中可以通过beanFactory.getBean( “id”) 获取一个实例,但是ServiceLoader 不支持,只能一次获取所有的接口实例; -
不支持排序
ServiceLoader 返回的接口实例没有进行排序,随着新的实例加入,会出现排序不稳定的情况; -
无法获的所有实现的类型 无法通过接口获取所有的接口实例类型;
-
作用域缺失,没有定义
singleton 和prototype 的定义,不利于用户进行自由定制。