来自抽象 T 类型的依赖注入 class

Dependency Injection from an Abstract T type class

我在代码中配置了Oracle和Postgres数据库。由于 oracle 和 Postgres 在设置布尔值和其他方面存在差异。我想配置 2 个不同的 classes(PostgresSetter 和 OracleSetter),它们根据数据库类型设置值。在运行时间开始,我想根据驱动类型注入数据库的setterclass。目前,我注释掉了未使用的数据库,但我想以编程方式执行此操作。

public abstract class DBSetter<T> /*implements DBSetter this interface added later*/{
    public static void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {
        if (data != null) {
            statement.setBoolean(index, data);
        } else {
            //if psql
            statement.setNull(index, Types.BOOLEAN);
            //if oracle
            statement.setNull(index, Types.INTEGER);
        }
        ...//other functions
    }
}

上面是 class 将布尔值设置为准备好的语句。我想将其分成 2 个,如下所示。

public interface DBSetter {

    static void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {}

}

public class OracleSetter implements DBSetter {

    public static void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {
        if (data != null) {
            statement.setBoolean(index, data);
        } else {
            statement.setNull(index, Types.INTEGER);
        }
    }
}

public class PostgresSetter implements DBSetter {

    public static void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {
        if (data != null) {
            statement.setBoolean(index, data);
        } else {
            statement.setNull(index, Types.BOOLEAN);
        }
    }
}

我创建了一个接口并创建了 2 个名为 OracleSetter 和 PostgreSetter 的新 classes 并实现了该接口。尽管如此,函数 setParameter 仍未被识别。如何根据 if 子句在启动时注入 Setters?

我假设您正在使用 Spring 框架进行依赖注入,因此您使用 @Autowired 注入 bean,在您的情况下,您尝试注入的接口是 DBSetter.

我们将继续使用您的第二个代码片段,但在删除静态方法之后:

public interface DBSetter {

    void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception;

}

public class OracleSetter implements DBSetter {

    public void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {
        if (data != null) {
            statement.setBoolean(index, data);
        } else {
            statement.setNull(index, Types.INTEGER);
        }
    }
}

public class PostgresSetter implements DBSetter {

    public void setParameter(PreparedStatement statement, int index, Boolean data)
            throws Exception {
        if (data != null) {
            statement.setBoolean(index, data);
        } else {
            statement.setNull(index, Types.BOOLEAN);
        }
    }
}

并且您需要使用如下配置 class 配置 bean 注入:

@Configuration
public class DBSetterConfiguration {
      @Bean
      public DBSetter configureDBSetter() {
            if(isPsql()) { // try to implement isPsql yourself, the method to check if you are using Postgres or not
               return new PostgresSetter();
            }
            else {
                return new OracleSetter();
            }
      }
}

最后使用@Autowired 调用 DBSetter:

@Autowired
DBSetter dbSetter;