Java 9 Services - перебирать классы провайдеров? - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь создать службу на Java 9 (на самом деле Java 11), которая имеет несколько провайдеров, в данном случае это служба DatabaseConnection.

Что я ожидаю, что смогу сделать (Пожалуйста, исправьте меня, если я полностью не разбираюсь в услугах на каком-то фундаментальном уровне):

  • Выполните итерацию по зарегистрированным провайдерам и найдите класс длясоздание экземпляра на основе аннотации (например, @DBC(engine="mssql"))
  • Найти существующий объект по внутреннему имени или идентификатору, который ему назначен после создания экземпляра (например, перебирать экземпляры созданных объектов и вызывать имя get)

Для начала, как я могу перебирать классы провайдера, чтобы я мог проверить аннотацию, которая указывает, какой механизм использует каждый провайдер, без создания чего-либо?Насколько я могу судить, 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

...