SPI的概念
英文全称为Service Provider Interface
是JDK内置的一种服务提供发现机制
SPI机制可以在不修改jar包或框架的情况下,为API接口提供新的实现
SPI机制的约定
- 具体做法
- 在
META-INF/services/
目录中创建以接口全限定名
命名的文件该文件内容为API具体实现类的全限定名
,例如:
文件内的内容如下:com.blueskykong.javaspi.serializer.KryoSerializer com.blueskykong.javaspi.serializer.JavaSerializer
- 使用
ServiceLoader
类动态加载META-INF
中的实现类ServiceLoader<ObjectSerializer> objectSerializers = ServiceLoader.load(ObjectSerializer.class) Iterator<ObjectSerializer> objectSerializerIterator= objectSerializers.iterator(); // 之后就可以通过objectSerializerIterator.next()按顺序获取实现类
- 如果SPI的实现类为jar,则需要放在当前程序
classpath
中 - API具体实现类必须有一个不带参数的构造方法
- 在
SPI用途
在JDBC4.0之前,连接数据库的时候,通常会用Class.forName("com.mysql.jdbc.Driver")
这句先加载数据库相关的驱动,然后再进行获取连接等的操作。而JDBC4.0之后不需要Class.forName
来加载驱动,直接获取连接即可,这里使用了Java的SPI扩展机制来实现