来自抽象 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;
我在代码中配置了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;