SPI为Service Provider Interface的缩写。为扩展框架的开发者使用。在Java的世界,有java.sql.Driver,commons-logging等使用。
2. 约定
- 在META/services目录中创建以接口权限定名为文件名,以具体实现类的权限定为内容
- SPI 的实现类需要放在classpath 中
- API 的实现类需要不带参数的构造函数
3. 代码实现
public interface Operation { int operation(int numberA, int numberB); }
public class AddOperation implements Operation { @Override public int operation(int numberA, int numberB) { return numberA + numberB; } }
public class DivisionOperation implements Operation { @Override public int operation(int numberA, int numberB) { if (numberB == 0) { throw new IllegalArgumentException("can not be 0."); } return numberA / numberB; } }
public class SpiMain { public static void main(String[] args) { Operation operation = new AddOperation(); System.out.println(operation.operation(6, 3)); ServiceLoader<Operation> operations = ServiceLoader.load(Operation.class); System.out.println(System.getProperty("java.class.path")); Iterator<Operation> iterator = operations.iterator(); while (iterator.hasNext()) { operation = iterator.next(); System.out.println(operation.operation(6, 0)); } } }