您需要私下綁定MyBatisModule並將映射公開爲唯一綁定屬性。下面有一個例子。我已經驗證它也可以工作:)
DaoModule:此模塊設置爲將單個映射器綁定到具有特定數據源的密鑰。請注意,這個類正在擴展一個「PrivateModue」,它將密鑰暴露給父模塊。你將使用這個鍵來注入映射。
public class DaoModule<T> extends PrivateModule {
private static final String ENVIRONMENT_ID = "development";
private final Key<T> key;
private final Class<T> mapper;
private final Provider<DataSource> dataSourceProvider;
public DaoModule(Key<T> key, Class<T> mapper, Provider<DataSource> dataSourceProvider) {
this.key = key;
this.mapper = mapper;
this.dataSourceProvider = dataSourceProvider;
}
@Override
protected void configure() {
install(new InnerMyBatisModule());
expose(key);
}
private class InnerMyBatisModule extends MyBatisModule {
@Override
protected void initialize() {
bind(key).to(mapper);
addMapperClass(mapper);
environmentId(ENVIRONMENT_ID);
bindDataSourceProvider(dataSourceProvider);
bindTransactionFactoryType(JdbcTransactionFactory.class);
}
}
}
MyModule的:該模塊由兩個不同的密鑰和不同的數據源的安裝兩個DaoModules用相同的映射器類型。
public class MyModule extends AbstractModule {
@Override
protected void configure() {
Key<MapperDao> key1 = Key.get(MapperDao.class, Names.named("Mapper1"));
Provider<DataSource> datasource1 = null;
Key<MapperDao> key2 = Key.get(MapperDao.class, Names.named("Mapper2"));
Provider<DataSource> datasource2 = null;
install(new DaoModule<MapperDao>(key1, MapperDao.class, datasource1));
install(new DaoModule<MapperDao>(key2, MapperDao.class, datasource2));
}
}
主:和主獲取相同類型的兩個映射器,但具有不同的數據源。
public class Main {
public static void main(String... args) {
Injector i = Guice.createInjector(new MyModule());
MapperDao mapper1 = i.getInstance(Key.get(MapperDao.class, Names.named("Mapper1")));
MapperDao mapper2 = i.getInstance(Key.get(MapperDao.class, Names.named("Mapper2")));
}
}
例注射劑類:這顯示瞭如何使用場噴射來噴射映射器
public class MyExampleClass {
@Inject
@Named("Mapper1")
MapperDao mapper1;
@Inject
@Named("Mapper2")
MapperDao mapper2;
}
如果你喜歡這個答案,請把它標記爲這樣。 – 2014-12-10 17:31:38
謝謝,這真的很有幫助。我正在研究的背景有點複雜,並且在某一時刻,實際上在那裏注射器變得有點困難。這就是爲什麼我試圖使用MapBinder與我的所有映射器而不是鍵綁定。這樣,我可以檢索所有映射器而不需要噴射器對象本身,但它不起作用。你知道是否有可能做到這一點,或者是唯一選擇的關鍵綁定?再次感謝 – 2015-01-08 15:57:19
@AndreuMarimon你不需要使用注入器......只需要在將值注入類時使用「@Named」註釋。我已將MyExampleClass添加到答案中。我只是用注射器來證明它被綁定在guice中。 – 2015-01-09 21:10:15