ServiceLoader是Java SE 6所提供的API,用于自动实例化继承了给定接口(或抽象类)的类,类似于Spring依赖注入的功能。

根据其官方文档,对于ServiceLoader来说,有两个概念需要弄清楚:

  • service:指已定义好的接口或者抽象类
  • service provider:指实现了特定service的具体类

ServiceLoader是一个泛型类,它的类型参数就表示service,需要实例化类型的超类(接口或抽象类)。

那么,需要实例化哪些provider呢,也就是继承了service的具体类?这需要在resource路径下的META-INF/services目录中定义一个配置文件。
这个配置文件的名称必须用service的绝对包路径来命名。文件的内容就是需要被实例化的provider:一行一个,必须是provider的绝对包路径。