springboot系列15:多数据源MongoDB
上一篇介绍了mongodb单数据源的使用,这次我们聊聊多数据源的使用。
多数据源 MongoDB 的使用
1、pom 配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
2、 配置两条数据源
mongodb.primary.uri=mongodb://localhost:28018 mongodb.primary.database=primary mongodb.secondary.uri=mongodb://localhost:28018 mongodb.secondary.database=secondary
3、 配置映射类
package top.zlcxy.multimongodb.properties; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "mongodb") 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; } }
4、 对第一个库封装
@Configuration @EnableConfigurationProperties(MultipleMongoProperties.class) @EnableMongoRepositories(basePackages = "top.zlcxy.multimongodb.repository.primary", mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE) public class PrimaryMongoConfig { protected static final String MONGO_TEMPLATE = "primaryMongoTemplate"; }
5、 对第二个库封装
@Configuration @EnableConfigurationProperties(MultipleMongoProperties.class) @EnableMongoRepositories(basePackages = "top.zlcxy.multimongodb.repository.secondary", mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE) public class SecondaryMongoConfig { protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate"; }
6、 读取对应的配置信息并且构造对应的 MongoTemplate
@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 MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception { MongoClient client = new MongoClient(new MongoClientURI(mongoProperties.getPrimary().getUri())); return new SimpleMongoDbFactory(client, mongoProperties.getPrimary().getDatabase()); } @Bean public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception { MongoClient client = new MongoClient(new MongoClientURI(mongoProperties.getSecondary().getUri())); return new SimpleMongoDbFactory(client, mongoProperties.getSecondary().getDatabase()); } }
6、 测试编写
@RunWith(SpringRunner.class) @SpringBootTest public class MuliMongodbTest { @Autowired private UserPrimaryRepository userPrimaryRepository; @Autowired private UserSecondaryRepository userSecondaryRepository; @Test public void testUser() { userPrimaryRepository.save(new User(1L,"张三", "123456")); List<User> primaryUsers = userPrimaryRepository.findAll(); for (User user : primaryUsers) { System.out.println(user); } userSecondaryRepository.save(new User(2L,"李四", "123456")); List<User> secondaryUsers = userSecondaryRepository.findAll(); for (User user : secondaryUsers) { System.out.println(user); } } }
7、 测试结果
2020-06-14 18:11:18.614 INFO 7120 --- [ main] org.mongodb.driver.connection : Opened connection [connectionId{localValue:3, serverValue:14}] to localhost:28018 User{id=1, userName='张三', passWord='123456'} 2020-06-14 18:11:19.019 INFO 7120 --- [ main] org.mongodb.driver.connection : Opened connection [connectionId{localValue:4, serverValue:15}] to localhost:28018 User{id=2, userName='李四', passWord='123456'}