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; }