1.需求
业务要求在一个spring项目中访问位于两个不同位置的mongodb数据库实例
2.思路
单个mongo 配置时,使用springdatamongodb 可以很方便的在配置文件中配置数据源.类似于
spring.data.mongodb.uri=mongodb://localhost:27017/test
两个数据源时不能这样方便的使用,需要自己去导入相应的数据源配置.
3.动手
Step1
在application.yaml中配置好需要的多数据源数据库链接地址
spring:
mongodb:
db1:
uri: mongodb://localhost:27017/db1
db2:
uri: mongodb://localhost:27017/db2
Step2
有了数据源之后,考虑如何使用这两个数据源.本着从一到二的原则,先创建第一个数据源配置类 mongoConfig.java
注解表明是配置类
@Configuration
//为了实现mongorepository的多数据源才这么操作.如果只是使用template,并不需要开启这个选项.
//这里的mongoTemplateRef指定repository需要使用到template.这个配置类既声明了两个tempplate,又指定了一个repository.
//basePackages 代表使用这个repository的接口所在的包
@EnableMongoRepositories(basePackages = "com.*.*dao", mongoTemplateRef = "template1")
public class mongoConfig {
//从配置文件中获得第一个数据源的uri
@Value("${spring.mongodb.db2.uri}")
private String db2_url;
//第二个数据源
@Value("${spring.mongodb.db1.uri}")
private String db1_url;
@Bean(name = "template1")
public MongoTemplate template1() {
return new MongoTemplate(db1MongoDatabaseFactory());
}
@Bean
public MongoDatabaseFactory db1MongoDatabaseFactory() {
return new SimpleMongoClientDatabaseFactory(db1_url);
}
//多数据源时,必须要保证有一个primary的mongoTemplate
@Bean
@Primary
public MongoDatabaseFactory db2MongoDatabaseFactory() {
//获得factory的重载方法有很多,我喜欢这种直接一个完整uri的形式
return new SimpleMongoClientDatabaseFactory(db2_url);
}
@Primary
@Bean(name = "template2")
public MongoTemplate template2() {
return new MongoTemplate(db2MongoDatabaseFactory());
}
}
上面这个类完成了几个动作
1.读取配置
2.声明两个template
3.声明一个repository及使用这个repository的接口所在的位置
注意:扫描包的位置和template引用要正确.
Step3
//那么接下来只要再声明一个配置类来启用第二个repository就可以了.
@Configuration
@EnableMongoRepositories(basePackages = "com.*.*.dao2", mongoTemplateRef = "template2")
public class SecondMongoConfig {
}
Ps: 关于使用template,只需要使用qualifier表明同类型但是不同名字的template即可选用想要的template.
@Autowired()
@Qualifier("template2")
MongoTemplate mongoTemplate;