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


Java 有来自 java.util 包的 ServiceLoader 类,它可以通过在类路径中搜索,来帮助在运行时 定位 服务提供商。对于模块中定义的服务提供商,我们可以查看示例应用程序,了解如何使用服务声明模块,以及它是如何工作的。

例如,我们有一个 "test.app" 模块,我们需要使用能够在 System.getLogger() 的帮助下从工厂方法中获取的记录器 Logger LoggerFinder 服务。

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

以下是 test.app.MainApp

package com.tutorialspoint.platformlogging.app;

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


这是 "test.logging" 模块内的 LoggerFinder 实现

package com.tutorialspoint.platformlogging.logger;

public class MyLoggerFinder extends LoggerFinder {
   @Override
   public Logger getLogger(String name, Module module) {
      // return a Logger depending on name/module
   }
}

在 "test.logging" 模块声明中,我们可以使用 "provides – with" 子句提供 LoggerFinder 服务的实现。 

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

更新于:2020 年 4 月 9 日

218 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.