Java SPI机制

1. 概述
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));
        }
    }
}

猜你喜欢

转载自tramp-zzy.iteye.com/blog/2310514