SpringBoot 集成多 MongoDB 实例的配置实践
在实际开发中,我们常遇到需要同时连接多个 MongoDB 集群的场景。Spring Boot 默认只支持单数据源配置,通过自定义 Bean 和排除自动配置,我们可以灵活地管理多个数据库实例。
1. 引入依赖
首先确保项目中引入了 Spring Data MongoDB 的 Starter 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2. 应用配置
在 application.yml 中定义两个独立的 MongoDB 连接信息,通过不同的前缀区分命名空间:
spring:
application:
name: double-mongo
profiles:
active: dev
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
server:
port: 8008
sys:
mongodb:
one:
uri: mongodb://user01:[email protected]:10135,192.168.1.3:10135/mongo01
two:
uri: mongodb://user02:[email protected]:10135,192.168.1.3:10135/mongo02
3. 配置类编写
主数据源配置
我们需要创建一个配置类来定义第一个(主)MongoDB 实例。这里的关键是设置 @Primary 注解,确保在没有指定名称时默认使用这个模板。
public class OneMongoConfig {
private MongoClient mongo;
@Primary
@Bean("mongoTemplate")
public MongoTemplate oneMongoTemplate(@Autowired @Qualifier("oneMongoDbFactory") MongoDbFactory mongoDbFactory, MongoConverter converter) {
return new MongoTemplate(mongoDbFactory, converter);
}
@Primary
@Bean
public MongoDbFactory oneMongoDbFactory(@Autowired @Qualifier("oneMongoProperties") MongoProperties properties, Environment environment, ObjectProvider<MongoClientOptions> options) {
MongoClientOptions _options = options.getIfAvailable();
MongoClientFactory mongoClientFactory = new MongoClientFactory(properties, environment);
this.mongo = mongoClientFactory.createMongoClient(_options);
return new SimpleMongoDbFactory(this.mongo, properties.getMongoClientDatabase());
}
@PreDestroy
public void close() {
if (this.mongo != null) {
this.mongo.close();
}
}
@Primary
@Bean
@ConfigurationProperties(prefix = "sys.mongodb.one")
public MongoProperties oneMongoProperties() {
return new MongoProperties();
}
}
从数据源配置
第二个实例的配置逻辑类似,只是去掉了 @Primary 注解,并使用了不同的 Bean 名称以便业务代码按需调用。
public class TwoMongoConfig {
private MongoClient mongo;
@Bean
public MongoTemplate twoMongoTemplate(@Autowired @Qualifier("twoMongoDbFactory") MongoDbFactory mongoDbFactory, MongoConverter converter) {
return new MongoTemplate(mongoDbFactory, converter);
}
@Bean
public MongoDbFactory twoMongoDbFactory(@Autowired @Qualifier("twoMongoProperties") MongoProperties properties, Environment environment, ObjectProvider<MongoClientOptions> options) {
MongoClientOptions _options = options.getIfAvailable();
MongoClientFactory mongoClientFactory = new MongoClientFactory(properties, environment);
this.mongo = mongoClientFactory.createMongoClient(_options);
return new SimpleMongoDbFactory(this.mongo, properties.getMongoClientDatabase());
}
@PreDestroy
public void close() {
if (this.mongo != null) {
this.mongo.close();
}
}
@Bean
@ConfigurationProperties(prefix = "sys.mongodb.two")
public MongoProperties twoMongoProperties() {
return new MongoProperties();
}
}
整合与启动类
最后,将上述配置导入到总配置类中,并在启动类里排除默认的 MongoDB 自动配置,防止冲突。
@Configuration
@Import({OneMongoConfig.class, TwoMongoConfig.class})
public class MongoConfig {
}
@SpringBootApplication(exclude = {MongoAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这样配置后,你可以通过注入 mongoTemplate 获取主库,或通过 twoMongoTemplate 获取从库,实现多数据源的灵活切换。

