You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AbstractReactiveMongoConfiguration连接两个Mongo仓库

Spring Data Reactive MongoDB 多数据源配置方案

核心原因说明

你之前新增配置不生效的核心原因是默认@EnableMongoRepositories会扫描全局Repository接口,默认绑定唯一的ReactiveMongoTemplate实例,新增配置的实例不会被自动关联,需要手动指定Repository扫描范围与对应Template的绑定关系。

步骤1:调整配置文件

先在application.yml/properties中新增第二个MongoDB的配置项:

# 主数据源配置(原有保留)
spring:
  data:
    mongodb:
      uri: mongodb://user1:pass1@host1:27017
      database: db1
  # 新增第二个数据源配置
  mongodb-secondary:
    uri: mongodb://user2:pass2@host2:27017
    database: db2

步骤2:修改原有主数据源配置

给主数据源相关Bean指定专属名称,同时限定其扫描的Repository包路径:

@Configuration
// 限定主数据源Repository所在的包,指定绑定的Template
@EnableMongoRepositories(
        basePackages = "com.xxx.repository.primary",
        reactiveMongoTemplateRef = "primaryMongoTemplate"
)
public class PrimaryMongoConfig extends AbstractReactiveMongoConfiguration {
    @Autowired
    private Environment env;

    @Value("${spring.data.mongodb.uri}")
    private String mongoUri;

    @Override
    protected String getDatabaseName() {
        return env.getProperty("spring.data.mongodb.database");
    }

    @Override
    protected void configureClientSettings(MongoClientSettings.Builder builder) {
        builder.applyConnectionString(new ConnectionString(mongoUri));
    }

    // 注册主数据源的MongoClient Bean
    @Bean("primaryMongoClient")
    @Override
    public MongoClient reactiveMongoClient() {
        return super.reactiveMongoClient();
    }

    // 注册主数据源的DatabaseFactory Bean
    @Bean("primaryMongoDatabaseFactory")
    @Override
    public ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory() {
        return super.reactiveMongoDatabaseFactory();
    }

    // 注册主数据源专属的Template Bean
    @Bean("primaryMongoTemplate")
    public ReactiveMongoTemplate primaryMongoTemplate(
            @Qualifier("primaryMongoDatabaseFactory") ReactiveMongoDatabaseFactory factory) {
        return new ReactiveMongoTemplate(factory);
    }
}

步骤3:新增第二个数据源配置类

第二个数据源同样绑定专属的Repository包路径,独立命名相关Bean:

@Configuration
// 限定第二个数据源Repository所在的包,指定绑定的Template
@EnableMongoRepositories(
        basePackages = "com.xxx.repository.secondary",
        reactiveMongoTemplateRef = "secondaryMongoTemplate"
)
public class SecondaryMongoConfig extends AbstractReactiveMongoConfiguration {
    @Autowired
    private Environment env;

    @Value("${spring.data.mongodb-secondary.uri}")
    private String secondaryMongoUri;

    @Override
    protected String getDatabaseName() {
        return env.getProperty("spring.data.mongodb-secondary.database");
    }

    @Override
    protected void configureClientSettings(MongoClientSettings.Builder builder) {
        builder.applyConnectionString(new ConnectionString(secondaryMongoUri));
    }

    @Bean("secondaryMongoClient")
    @Override
    public MongoClient reactiveMongoClient() {
        return super.reactiveMongoClient();
    }

    @Bean("secondaryMongoDatabaseFactory")
    @Override
    public ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory() {
        return super.reactiveMongoDatabaseFactory();
    }

    @Bean("secondaryMongoTemplate")
    public ReactiveMongoTemplate secondaryMongoTemplate(
            @Qualifier("secondaryMongoDatabaseFactory") ReactiveMongoDatabaseFactory factory) {
        return new ReactiveMongoTemplate(factory);
    }
}

步骤4:业务代码分层使用

  • 主数据源对应的Repository接口全部放在com.xxx.repository.primary包下,自动使用第一个Mongo连接
  • 第二个数据源对应的Repository接口全部放在com.xxx.repository.secondary包下,自动使用第二个Mongo连接
  • 如果需要手动注入Template,加上@Qualifier指定Bean名即可:
// 注入主数据源Template
@Autowired
@Qualifier("primaryMongoTemplate")
private ReactiveMongoTemplate primaryTemplate;

// 注入第二个数据源Template
@Autowired
@Qualifier("secondaryMongoTemplate")
private ReactiveMongoTemplate secondaryTemplate;

内容的提问来源于stack exchange,提问作者Achoi98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:24:03