springboot+mongo 多数据源简单配置
发布于: 2021 年 06 月 01 日
背景
由于项目新老库迁移,需要配置 mongo 多数据源。受益于框架采用 springboot,简单实现,步骤如下。
实现
1. 依赖引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>复制代码
2. MongoDBFactory
创建 mongoTemplate 工厂类 MongoDBFactory,通过传入 uri 方式,获得 MongoDBFactory 对象。
@Configurationpublic abstract class AbstractMongoConfig { public MongoDatabaseFactory mongoDbFactory(String uri) { // uri = "mongodb://name:pass@localhost:27017/test"; ConnectionString connectionStringObj = new ConnectionString(uri); return new SimpleMongoClientDatabaseFactory(connectionStringObj); }
abstract public MongoTemplate getMongoTemplate();}
复制代码
3. 注入 MongoTemplate
注入新数据源,其中 MappingMongoConverter 可自定义 mongo 转换器,主要负责存取 mongo 数据时的操作。比如 converter.setTypeMapper(new DefaultMongoTypeMapper(null)) 会将 mongo 数据中_class 字段去除。
@Slf4j@Configuration@EnableMongoRepositories(mongoTemplateRef = "newMongoTemplate")public class NewMongoConfig extends AbstractMongoConfig{
@Value("${spring.data.mongodb.new.host}") private String host; @Value("${spring.data.mongodb.new.port}") private String port; @Value("${spring.data.mongodb.new.database}") private String database; @Value("${spring.data.mongodb.new.username}") private String username; @Value("${spring.data.mongodb.new.password}") private String password;
@Override public @Bean(name = "newMongoTemplate") MongoTemplate getMongoTemplate() { StringBuffer stringBuffer = new StringBuffer("mongodb://"); stringBuffer.append(username).append(":") .append(password).append("@") .append(host).append(":") .append(port).append("/") .append(database); String uri = stringBuffer.toString(); log.info("mongo >> uri={}", uri); MappingMongoConverter converter = new MappingMongoConverter( new DefaultDbRefResolver(mongoDbFactory(uri)), new MongoMappingContext()); converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(uri), converter);
return mongoTemplate; }}复制代码
通过 @Primary,默认使用旧数据源
@Slf4j@Configuration@EnableMongoRepositories(mongoTemplateRef = "oldMongoTemplate")public class OldMongoConfig extends AbstractMongoConfig{
@Value("${spring.data.mongodb.old.host}") private String host; @Value("${spring.data.mongodb.old.port}") private String port; @Value("${spring.data.mongodb.old.database}") private String database; @Value("${spring.data.mongodb.old.username}") private String username; @Value("${spring.data.mongodb.old.password}") private String password;
@Override @Primary public @Bean(name = "oldMongoTemplate") MongoTemplate getMongoTemplate() { StringBuffer stringBuffer = new StringBuffer("mongodb://"); stringBuffer.append(username).append(":") .append(password).append("@") .append(host).append(":") .append(port).append("/") .append(database); String uri = stringBuffer.toString();
log.info("mongo >> uri={}", uri); MappingMongoConverter converter = new MappingMongoConverter( new DefaultDbRefResolver(mongoDbFactory(uri)), new MongoMappingContext()); converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(uri), converter);
return mongoTemplate; }}复制代码
4. 关闭 mongo 自动配置
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})public class ServerApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ServerApplication.class); }
public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); }
}复制代码
划线
评论
复制
发布于: 2021 年 06 月 01 日阅读数: 20
版权声明: 本文为 InfoQ 作者【Mars】的原创文章。
原文链接:【http://xie.infoq.cn/article/2fe33a2269fb29f0cbb1254a9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
Mars
关注
还未添加个人签名 2018.06.12 加入
还未添加个人简介











评论