情景
项目中需要使用多个不同系统的mongodb,而常规下,在配置文件使用的自动配置方式无法满足业务。所以,自定义多数据源可以满足以下需求:
- 使用多个mongodb。
- 对mongodb的信息进行加密。
废话少说,直接上代码。
1. 导包
重点是:spring-boot-starter-data-mongodb包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xywei.springboot</groupId>
<artifactId>demo-mongo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-mongo</name>
<description>Demo project for Spring Boot using mongoTemplate</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.7</spring-boot.version>
</properties>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 添加自定义配置文件
server:
port: 8090
mongodb:
primary:
username: test1
password: test1
database: test1
address:
192.168.126.147: 27017
serverSelectionTimeoutMs: 5000
connectTimeoutMs: 3000
maxSize: 100
minSize: 3
maxWaitTimeMs: 5000
maxConnectionIdleTime: 300000
admin:
username: admin
password: admin
database: admin
address:
192.168.126.147: 27017
serverSelectionTimeoutMs: 5000
connectTimeoutMs: 3000
maxSize: 100
minSize: 3
maxWaitTimeMs: 5000
maxConnectionIdleTime: 300000
3. 添加配置多数据源
3.1 AbstractMongoDbConfig.java,配置factory使用
方法1:
package com.xywei.springboot.demomongo.config.mongodb;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import lombok.Data;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Data
public abstract class AbstractMongoDbConfig {
private String uri;
private String username;
private String password;
private String database;
private Map<String, Integer> address;
private long serverSelectionTimeoutMs;
private int connectTimeoutMs;
private int maxSize;
private int minSize;
private long maxWaitTimeMs;
private long maxConnectionIdleTime;
public MongoDatabaseFactory mongoDatabaseFactory() {
List<ServerAddress> serverAddresses = new ArrayList<>();
address.forEach((host, port) -> {
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
});
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder -> {
builder.hosts(serverAddresses);
builder.serverSelectionTimeout(serverSelectionTimeoutMs, TimeUnit.MILLISECONDS);
})
.applyToSocketSettings(builder -> {
builder.connectTimeout(connectTimeoutMs, TimeUnit.MILLISECONDS);
})
.applyToConnectionPoolSettings(builder -> {
builder.maxSize(maxSize);
builder.minSize(minSize);
builder.maxWaitTime(maxWaitTimeMs, TimeUnit.MILLISECONDS);
builder.maxConnectionIdleTime(maxConnectionIdleTime, TimeUnit.MILLISECONDS);
})
.credential(MongoCredential.createCredential(username, database, password.toCharArray()))
.build();
MongoClient mongoClient = MongoClients.create(settings);
return new SimpleMongoClientDatabaseFactory(mongoClient, database);
}
public abstract MongoTemplate getMongoTemplate();
}
方法2:
package com.xywei.springboot.demomongo.config.mongodb;
import lombok.Data;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
@Data
public abstract class AbstractMongoDbConfig {
private String uri;
private String username;
private String password;
private String database;
public MongoDatabaseFactory mongoDatabaseFactory() {
String connectionString = "mongodb://" + username + ":" + password+ "@"+ uri +"/" + database;
return new SimpleMongoClientDatabaseFactory(connectionString);
}
public abstract MongoTemplate getMongoTemplate();
}
3.2 配置数据源1,MongoDbConfigAdmin.java
package com.xywei.springboot.demomongo.config.mongodb;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
@Configuration
@ConfigurationProperties("mongodb.admin")
public class MongoDbConfigAdmin extends AbstractMongoDbConfig{
@Bean(name = "mongoTemplateAdmin")
@Override
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDatabaseFactory());
}
}
3.3 配置数据源2,MongoDbConfigPrimary.java
package com.xywei.springboot.demomongo.config.mongodb;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
@Configuration
@ConfigurationProperties("mongodb.primary")
public class MongoDbConfigPrimary extends AbstractMongoDbConfig{
@Primary
@Bean(name = "mongoTemplatePrimary")
@Override
public MongoTemplate getMongoTemplate() {
return new MongoTemplate(mongoDatabaseFactory());
}
}
3.4 使用
package com.xywei.springboot.demomongo;
import com.xywei.springboot.demomongo.entity.MergeRequest;
import com.xywei.springboot.demomongo.entity.TestUser;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class TestController {
@Resource(name = "mongoTemplatePrimary")
private MongoTemplate mongoTemplatePrimary;
@Resource(name = "mongoTemplateAdmin")
private MongoTemplate mongoTemplateAdmin;
@GetMapping("/pk")
public MergeRequest testFind() {
MergeRequest mergeRequest = mongoTemplatePrimary.findById("633d97d27b6fbe75860e4c21", MergeRequest.class);
System.out.println(mergeRequest);
return mergeRequest;
}
@GetMapping("/admin")
public TestUser testFind2() {
return mongoTemplateAdmin.findById("633e7b9ddf226efab809741b", TestUser.class);
}
}
4. 总结
注意配置bean的时候,只能有一个primary,并且,最重要的是,注入的时候,需要指定名称,所以这时候使用@Resource比较方便的。
|