Guice - 注入多个数据源

时间:2014-08-06 09:32:35

标签: java dependency-injection runtime guice

假设我有许多数据源:

class SomeDataSource {

   SomeDataSource(Params params) {
     //..
   } 
}

我想将它们放入HashMap<String, SomeDataSource>

public class SomeModule extends AbstractModule {

  public void configure() {

  }

  @Provides
  private Map<String, SomeDataSource> loadDataSourcesFromFile() {

    // read params from cfg file
    //..

    Map<String, SomeDataSource> dataSources = new HashMap<>();
    dataSources.put("source1", new SomeDataSource(params));
    dataSources.put("source2", new SomeDataSource(params));
    dataSources.put("source3", new SomeDataSource(params));

  }
}

..并注入我的 DAO bean(单身)。

@Singleton
public class SomeDAO {

  @Inject
  private Map<String, SomeDataSource> dataSources;

  public doAction(String dataSourceId) {

    dataSources.get(dataSourceId). //..
  }

}

所以,我的问题是:

  1. 如何将Map<String, SomeDataSource>绑定到SomeDAO
  2. 如何在运行时更改/重新加载注入的数据源?
  3. 对不起,我是Guice的新手。

    感谢。

1 个答案:

答案 0 :(得分:1)

  

如何在运行时更改/重新加载注入的数据源

首先,在我的选项中,确保地图是不可变的是最佳做法。允许其他模块改变类不知道的状态是一种代码味道。

我有两个解决方案:

解决方案1 ​​:每次需要轮询数据源时,创建一个提供者轮询地图实例。提供者将负责返回最新的数据源映射。

提供者示例:

@Singleton
public class SomeDAO {

  @Inject
  private Provider<Map<String, SomeDataSource>> dataSourceProvider;

  public doAction(String dataSourceId) {

    dataSourceProvider.get().get(dataSourceId). //..
  }

}

解决方案2 :一个更好的解决方案,但同样的想法,就是创建一个类,负责根据一个键返回最新和最新的数据源(一个保持地图更新)。

DataSourceManager示例:

@Singleton
public class SomeDAO {

  @Inject
  private DataSourceManager dataSourceManager;

  public doAction(String dataSourceId) {

    dataSourceManager.get(dataSourceId). //..
  }

}