有条件的@Autowired?

tob*_*obi 5 spring factory autowired

我有一个我自动装配的 HsqldbReconciler(用于与 HSQLDB 数据库“工作”),例如:

@Autowired
HsqldbReconciler hsqldbReconciler;
Run Code Online (Sandbox Code Playgroud)

将来会有 OracleReconciler、MssqlReconciler 等。我需要根据用户选择的连接类型来使用它们。

我应该如何实施?通常我会有一种工厂,它只返回所需的协调器。我目前可以想象,spring 的唯一方法是自动装配每个 Reconciler 的一个实例,然后在代码中使用其中一个。有没有更好的办法?

Eka*_*ogi 2

创建一个包含所有 bean 的工厂类,例如

@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;
   }

  }

}
Run Code Online (Sandbox Code Playgroud)

现在使用这个工厂如下

class SomeClass{

  @Autowired private Factory factory;

  public Object someMethod(){
    Object reconciler = factory.getInstance("mssql");
    ((MssqlReconciler)reconciler).someMethod();
  }
}
Run Code Online (Sandbox Code Playgroud)