SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。
实现
1、定义接口
public interface Animal { void say(); }
2、接口实现类
public class Cat implements Animal { @Override public void say() { System.out.println("i'm a cat"); } }
public class Dog implements Animal { @Override public void say() { System.out.println("i'm a dog"); } }
3、在META-INF/services目录下创建和配置对应的文件
com.vincent.spi.Cat com.vincent.spi.Dog
4、测试
public class SPIMain { public static void main(String[] args) { ServiceLoader<Animal> loaders = ServiceLoader.load(Animal.class); for (Animal animal : loaders) { animal.say(); } } }
输出结果:
public class SPIMain { public static void main(String[] args) { ServiceLoader<Animal> loaders = ServiceLoader.load(Animal.class); for (Animal animal : loaders) { animal.say(); } } }
5、应用
应用到java spi的框架还是很多的,如:
(1)spring的web包
(2)durid连接池
(3)数据库驱动加载
等等。。。