Я пытаюсь создать службу на 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