获取与ServiceLoader提供多个服务的服务提供者类的相同实例

时间:2018-09-11 11:52:32

标签: java serviceloader

我有一个问题,我不知道该怎么解决

说我有两个服务提供商接口(SPI)

public interface View{
    display();
}

public interface Logger{
    log(String s);
}

以及同时提供这两种服务的服务提供商

public class LogView implements View, Logger{
    ...
}

问题是,当我尝试通过ServiceLoader.load(Logger.class)获取日志服务的实例时,它与使用ServiceLoader.load(View.class)创建的实例不同。有没有办法解决这个问题,以便我可以从两个调用中获得相同的对象实例?

这个想法是,在将视图作为GUI加载后,我希望能够登录到该GUI的同一实例,而不是另一个。现在,我被两个单独的实例卡住了,因此日志确实显示了。

1 个答案:

答案 0 :(得分:2)

已将解决方案与Java模块一起添加,但需要注意的是,它可与显式模块一起使用,即与模块信息中的服务声明一起使用,而不是与{{1中的文件}}。

然后,您可以声明要使用的&&方法代替公共默认构造函数,而返回类型META-INF/services必须可分配给服务类型。声明了这样的方法后,声明类型不必是public static T provider()本身的实现,但是它不是错误。

因此给出了类声明

T
T
package somemodule;

public interface Logger{
    void log(String s);
}

和类似的模块声明

package somemodule;

public interface View{
    void display();
}

以下代码显示package somemodule; public class LogView implements View, Logger { static final LogView INSTANCE = new LogView(); private LogView() {} public static LogView provider() { return INSTANCE; } @Override public void display() { System.out.println("display"); } @Override public void log(String s) { System.out.println("log "+s); } }

module SomeModule {
    uses somemodule.Logger;
    uses somemodule.View;

    provides somemodule.Logger with somemodule.LogView;
    provides somemodule.View with somemodule.LogView;
}