如何通过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
相关产品推荐
相关产品推荐

