spring boot MongoDB 多数据源配置(包含template和repository)

1,013 阅读2分钟

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;