假设我有许多数据源:
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). //..
}
}
所以,我的问题是:
Map<String, SomeDataSource>
绑定到SomeDAO
?对不起,我是Guice的新手。
感谢。
答案 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). //..
}
}