Я пытаюсь узнать о Службах Java 9, так что это может быть не идеальный сценарий, но то, что я использую, чтобы попытаться изучить службы, в частности ...
Я пытаюсь создатьсервис для классов DatabaseConnection.Возможно, существует поставщик для MySQL, другой для SQLServer и т. Д. Приложению может потребоваться три подключения SQLServer и два подключения MySQL.Итак, для этого приложение может установить имя подключения как часть метода init.
Итак, я пытаюсь создать метод, который будет жить в интерфейсе службы и принимать два аргумента:имя соединения и ядро базы данных.Он должен вернуть уже созданного экземпляра провайдера, если таковой существует, или создать нового (при условии, что определен правильный провайдер), но я не могу этого сделать.Он просто возвращает уже созданную версию.
У меня есть метод:
public static DatabaseConnection getDBCByNameEngine(String name, String dbEngine) throws NoProviderException
{
ServiceLoader<DatabaseConnection> dbsl = ServiceLoader.load(DatabaseConnection.class);
// See if the connection with that name exists
for (Databaseconnection dbco : dbsl) {
if (dbco.getName().equals(name)) return dbco;
}
// Create a new instance
Optional<DatabaseConnection> dbc = dbcs.stream()
// This filter is checking an annotation Engine(name="whatever")
.filter(provider -> engineMatches(provider.type(), engineName);
.map(ServiceLoader.Provider::get)
.findFirst();
if (dbc.isPresent()) {
dbc.setName(name);
return dbc;
}
}
Я создал службу, которая является интерфейсом с именем DatabaseConnection:
public interface DatabaseConnection
{
public static getDBCByNameEngine(String name, String dbEngine) throws NoProviderException
{
// see above
}
void init(connectionName, connectionString, String username, String password);
String getName();
// DB stuff
}
Что происходит, когда я вызываю метод в первый раз для поставщика SQLServer с именем conn1, я получаю новый экземпляр с именем conn1.Во второй раз, когда я вызываю поставщика SQLSerer с именем conn2, я получаю тот же экземпляр, переименованный в conn2.