Java 9模块/服务系统-按名称获取实例化的服务提供程序,如果不存在,则获取一个新的服务提供程序?

时间:2019-03-21 20:01:35

标签: java java-9 java-module service-provider

我正在尝试学习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。

0 个答案:

没有答案