何时在Java 9的模块中使用ServiceLoader类?

Java具有java.util包中的ServiceLoader 类,该类可通过在类路径中搜索来帮助在运行时定位 服务提供者。对于模块中定义的服务提供者,我们可以查看示例应用程序以声明带有服务的模块及其工作方式。

例如,我们有一个“ test.app ”模块,我们需要使用Logger,可以通过LoggerFinder 服务从System.getLogger()工厂方法中检索该Logger 。

module com.nhooo.test.app {
   requires java.logging;
   exports com.nhooo.platformlogging.app;
   uses java.lang.System.LoggerFinder;
}

下面是test.app.MainApp类:

package com.nhooo.platformlogging.app;

public class MainApp {
   private static Logger LOGGER = System.getLogger();
   public static void main(String args[]) {
      LOGGER.log();
   }
}


这是“ test .logging ”模块中的LoggerFinder 实现:

package com.nhooo.platformlogging.logger;

public class MyLoggerFinder extends LoggerFinder {
   @Override   public Logger getLogger(String name, Module module) {
      //根据名称/模块返回记录器
   }
}

在“ test.logging ”模块声明中,我们可以使用“ Provides With ”子句提供LoggerFinder 服务的实现。 

module com.nhooo.test.logging {
   provides java.lang.System.LoggerFinder
   with com.nhooo.platformlogging.logger.MyLoggerFinder;
}