接上一篇博客:Play Framework 2.5 整合 MyBatis
在整合 MyBatis 的基础上,如果想要使用多个数据源的话,就不是增加一个 Module 那么简单了。
如果我们在上一步的基础上,再加一个 Module ,提供不同的 DataSourceProvider ,会提示下面这个错误:
1) A binding to javax.sql.DataSource was already configured at org.mybatis.guice.MyBatisModule.bindDataSourceProvider(MyBatisModule.java:328) (via modules: com.google.inject.util.Modules$OverrideModule -> module.PlayMyBatisModule2).
同样参考 MyBatis 官方整合 Guice 的文档 Multiple Datasources 部分
需要使用 PrivateModule 再封装一层:
package module;
import com.google.inject.Key;
import com.google.inject.PrivateModule;
import com.google.inject.Provider;
import org.apache.ibatis.io.ResolverUtil;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.guice.MyBatisModule;
import play.db.Database;
import play.db.NamedDatabaseImpl;
public class PlayMyBatisModule1 extends PrivateModule {
@Override
protected void configure() {
install(new MyBatisModule() {
@Override
protected void initialize() {
environmentId("default");
Provider<Database> provider = binder().getProvider(Key.get(Database.class, new NamedDatabaseImpl("my-db1")));
bindDataSourceProvider(() -> provider.get().getDataSource());
bindTransactionFactoryType(JdbcTransactionFactory.class);
addMapperClasses("com.morven.product.mapper.db1");
}
});
// 利用 MyBatis 的工具类,获取 Dao 包路径下所有的 class 并暴露到 Guice 全局环境中
new ResolverUtil<>()
.find(new ResolverUtil.IsA(Object.class), "com.morven.product.mapper.db1")
.getClasses()
.forEach(PlayMyBatisModule2.this::expose);
}
}
注意:
- 如果不在 install 方法后面调用 expose 把 Dao 类暴露到全局环境,Controller 或 Service 会获取不到 Dao