有条件的@Autowired?
conditional @Autowired?
我有一个自动装配的 HsqldbReconciler(用于 "work" 和 HSQLDB 数据库),例如:
@Autowired
HsqldbReconciler hsqldbReconciler;
将来会有 OracleReconciler、MssqlReconciler 等。我需要根据用户选择的连接类型来使用它们。
我该如何实施?通常我会有一种工厂,其中 returns 只有需要的 Reconciler。在 spring 中,我目前可以想象的唯一方法是自动装配每个 Reconciler 的实例,然后在代码中使用其中一个。有没有更好的方法?
创建一个包含所有 bean 的工厂 Class,例如
@Component
class Factory{
@Autowired HsqldbReconciler hsqldb;
@Autowired OracleReconciler oracle;
@Autowired MssqlReconciler mssql;
public Object getInstance(String type){
switch(type){
case "mssql" : return mssql;
case "oracle" : return oracle;
// and so on
default : return null;
}
}
}
现在使用这个Factory如下
class SomeClass{
@Autowired private Factory factory;
public Object someMethod(){
Object reconciler = factory.getInstance("mssql");
((MssqlReconciler)reconciler).someMethod();
}
}
在您的配置中使用相同的名称但不同的条件定义它们:
@Bean(name = "dbReconciler")
@Conditional(HsqldbReconcilerEnabled.class)
public ReconcilerBase getHsqldbReconciler() {
return new HsqldbReconciler();
}
@Bean(name = "dbReconciler")
@Conditional(OracleReconcilerEnabled.class)
public ReconcilerBase getOracleReconciler() {
return new OracleReconciler();
}
@Bean(name = "dbReconciler")
@Conditional(MssqlReconcilerEnabled.class)
public ReconcilerBase getMssqlReconciler() {
return new MssqlReconciler();
}
创建条件读取 app.properties:
HsqldbReconciler.enabled=true
OracleReconciler.enabled=false
MssqlReconciler.enabled=false
像这样:
public class HsqldbReconcilerEnabled implements Condition {
private static final String PROP_ENABLED = "HsqldbReconciler.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty(PROP_ENABLED);
return Boolean.parseBoolean(property);
}
}
// etc...
像这样使用:
@Autowired
@Qualifier("dbReconciler")
ReconcilerBase dbReconsiler;
确保您不会同时启用多个 bean。
我有一个自动装配的 HsqldbReconciler(用于 "work" 和 HSQLDB 数据库),例如:
@Autowired
HsqldbReconciler hsqldbReconciler;
将来会有 OracleReconciler、MssqlReconciler 等。我需要根据用户选择的连接类型来使用它们。
我该如何实施?通常我会有一种工厂,其中 returns 只有需要的 Reconciler。在 spring 中,我目前可以想象的唯一方法是自动装配每个 Reconciler 的实例,然后在代码中使用其中一个。有没有更好的方法?
创建一个包含所有 bean 的工厂 Class,例如
@Component
class Factory{
@Autowired HsqldbReconciler hsqldb;
@Autowired OracleReconciler oracle;
@Autowired MssqlReconciler mssql;
public Object getInstance(String type){
switch(type){
case "mssql" : return mssql;
case "oracle" : return oracle;
// and so on
default : return null;
}
}
}
现在使用这个Factory如下
class SomeClass{
@Autowired private Factory factory;
public Object someMethod(){
Object reconciler = factory.getInstance("mssql");
((MssqlReconciler)reconciler).someMethod();
}
}
在您的配置中使用相同的名称但不同的条件定义它们:
@Bean(name = "dbReconciler")
@Conditional(HsqldbReconcilerEnabled.class)
public ReconcilerBase getHsqldbReconciler() {
return new HsqldbReconciler();
}
@Bean(name = "dbReconciler")
@Conditional(OracleReconcilerEnabled.class)
public ReconcilerBase getOracleReconciler() {
return new OracleReconciler();
}
@Bean(name = "dbReconciler")
@Conditional(MssqlReconcilerEnabled.class)
public ReconcilerBase getMssqlReconciler() {
return new MssqlReconciler();
}
创建条件读取 app.properties:
HsqldbReconciler.enabled=true
OracleReconciler.enabled=false
MssqlReconciler.enabled=false
像这样:
public class HsqldbReconcilerEnabled implements Condition {
private static final String PROP_ENABLED = "HsqldbReconciler.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty(PROP_ENABLED);
return Boolean.parseBoolean(property);
}
}
// etc...
像这样使用:
@Autowired
@Qualifier("dbReconciler")
ReconcilerBase dbReconsiler;
确保您不会同时启用多个 bean。