springboot配置mongodb多数据源

  1. pom.xml引入依赖
    1. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>2.3.4.RELEASE</version> </dependency>
  1. application.yml配置数据源
    1. mongodb: primary: uri: mongodb://username:password@host:port/admin database: primarydb secondary: uri: mongodb://username:password@host:port/admin database: secondarydb
  1. 读取数据源配置
    1. import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "mongodb") @Configuration public class MultipleMongoProperties { private MongoProperties primary = new MongoProperties(); private MongoProperties secondary = new MongoProperties(); public MongoProperties getPrimary() { return primary; } public void setPrimary(MongoProperties primary) { this.primary = primary; } public MongoProperties getSecondary() { return secondary; } public void setSecondary(MongoProperties secondary) { this.secondary = secondary; } }
  1. 通过区分包来使用多数据源 com.bobo.primary包对应数据源primarydb,com.bobo.secondary包对应数据源secondarydb。
    1. import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @Configuration @EnableMongoRepositories(basePackages = "com.bobo.primary", mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE) public class PrimaryMongoConfig { protected static final String MONGO_TEMPLATE = "primaryMongoTemplate"; } import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @Configuration @EnableMongoRepositories(basePackages = "com.bobo.secondary", mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE) public class SecondaryMongoConfig { protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate"; }
  1. 创建多数据源对应的MongoDatabaseFactory和MongoTemplate Bean对象
    1. import com.mongodb.client.MongoClients; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; @Configuration public class MultipleMongoConfig { @Autowired private MultipleMongoProperties mongoProperties; @Primary @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE) public MongoTemplate primaryMongoTemplate() throws Exception { return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary())); } @Bean @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE) public MongoTemplate secondaryMongoTemplate() throws Exception { return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary())); } @Bean @Primary public MongoDatabaseFactory primaryFactory(MongoProperties mongo) throws Exception { return new SimpleMongoClientDatabaseFactory(MongoClients.create(mongo.getUri()),mongo.getDatabase()); } @Bean public MongoDatabaseFactory secondaryFactory(MongoProperties mongo) throws Exception { return new SimpleMongoClientDatabaseFactory(MongoClients.create(mongo.getUri()),mongo.getDatabase()); } }
  1. 测试与应用
    1. import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController @RequestMapping("mongoTest") public class MongoTestC { @Resource(name = PrimaryMongoConfig.MONGO_TEMPLATE) private MongoTemplate primaryMongoTemplate; //第一个库的MongoTemplate @Resource(name = SecondaryMongoConfig.MONGO_TEMPLATE) private MongoTemplate secondaryMongoTemplate; //第二个库的MongoTemplate @Autowired private MongoTemplate mongoTemplate; //第一个库的MongoTemplate @GetMapping(value = "/test1") public void saveTest() throws Exception { PersonTest mgtest = new PersonTest(); mgtest.setId(8); mgtest.setAge(88); mgtest.setName("8888"); primaryMongoTemplate.save(mgtest); secondaryMongoTemplate.save(mgtest); } }