何时在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;
}