Java与Spring中SPI机制的探讨与思考
背景
项目中用到了SPI机制, 使用过程也走了一些弯路. 这里记录下来.
几种SPI方式
Java中SPI机制
使用方式
实际应用场景
- jdbc驱动, 例如mysql-connector-java.jar中, 就在META-INF/services/java.sql.Driver
问题
比较严重的一个问题是, 这些SPI的Bean游离于Spring容器外.
SPI中引入的对象(Bean)没有被Spring容器管理起来.
从而这些Bean如果依赖到了Spring容器中其他Bean, 就只能手动从Spring容器中拿出来复制, 即手动注入.
太麻烦了.
Service Loader Spring integration
Spring Factories Loader
思考
在什么时候需要用到ServiceLoader/SPI? SPI优点具体是啥?
个人理解, 最大的优点是编译期与实现类/包解耦.