我正在尝试学习Java 9服务,所以这可能不是理想的情况,但是我要用来尝试学习服务的内容特别是...
我正在尝试为DatabaseConnection类创建服务。可能有一个MySQL的提供程序,另一个是SQLServer的提供程序,等等。一个应用程序可能需要三个SQLServer连接和两个MySQL连接。因此,为此,应用程序可以将连接名称设置为init方法的一部分。
因此,我正在尝试创建一个将存在于Service接口中的方法,并接受两个参数,即连接的名称和数据库引擎。如果存在一个实例化的提供程序,它应该返回一个已经实例化的提供程序,或者创建一个新的(假设定义了一个适当的提供程序),但是我似乎无法实现这一点。它只是返回已经实例化的版本。
这是我的方法:
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
}
当我第一次为名为conn1的SQLServer提供程序调用该方法时,会得到一个名为conn1的新实例。第二次调用名为conn2的SQLSerer提供程序时,我得到了相同的实例,重命名为conn2。