Java 9服务-遍历提供程序类吗?

时间:2019-03-29 14:04:05

标签: java java-9

我正在尝试使用Java 9(实际上是Java 11)创建一个具有多个提供程序的服务,在本例中为DatabaseConnection服务。

我希望能够做的(如果我完全不了解某些基本服务,请纠正我):

  • 遍历已注册的提供者,并基于注释(例如@DBC(engine="mssql"))找到要实例化的类
  • 通过实例化后分配的内部名称或标识符查找现有对象(例如遍历实例化的对象并调用get名称)

对于初学者来说,如何遍历Provider类,以便可以检查一个指示每个提供程序使用哪个引擎的注释,而无需实例化任何内容?据我所知,stream()应该返回我可以迭代并检查注解的提供者流,但是stream()。size()返回0。

第二,如何遍历实例化的提供程序? iterator()看起来应该这样做,但是根据文档,它实例化了尚未实例化的每个提供程序。

这是我的服务

public interface DatabaseConnection
{
    void init(String connectionString, String internalName, String username, String password);
    String getName();
    String query();
}

这是我的提供者之一:

@DBC(engine="mssql")
public class MSSQLDatabaseConnection implements DatabaseConnection
{
  public void init(String connectionString, String internalName, String username, String password)
  {
    this.internalName = internalName;
    connect(connectionString, username, password);
  }
  public String getName()
  {
    return internalName;
  }
  public String query()
  {
    //Does stuff
  }
  public void connect()
  {
    return null;
  }
}

这是我的模块信息:

module my.libs.database {
    uses DatabaseConnection;
    exports my.libs.database;
    exports my.libs.database.util;
    exports my.libs.database.api;
    exports my.libs.database.exception;
    requires java.sql;
    requires com.microsoft.sqlserver.jdbc;

    provides DatabaseConnection with MSSQLDatabaseConnection, TestDatabaseConnection;
}

最后,在我的主类中,我尝试获取流,但未返回任何内容:

ServiceLoader<DatabaseConnection> dbcs = ServiceLoader.load(DatabaseConnection.class);
Stream<ServiceLoader.Provider<DatabaseConnection>> test1 = dbcs.stream();
System.out.println("Found " + test1.count() + " classes");

输出Found 0 classes

0 个答案:

没有答案