Spring Boot 通过其自动配置 (Auto-Configuration) 机制,极大的简化了 MongoDB 的连接和集成。当 Spring Boot 检测到 MongoDB Java 驱动程序 (如 mongodb-driver-sync
或 mongodb-driver-reactivestreams
) 和 spring-boot-starter-data-mongodb
在类路径上时,它会自动尝试配置必要的 bean 来连接 MongoDB。
Spring Boot 如何自动配置 MongoDB 连接:
-
依赖检测:
- 首先,你需要将
spring-boot-starter-data-mongodb
依赖添加到你的pom.xml
(Maven) 或build.gradle
(Gradle) 文件中。这个 starter 会引入必要的 MongoDB 驱动和 Spring Data MongoDB 库。
xml<!-- For imperative programming --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- For reactive programming (optional, if you use WebFlux) --> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> -->
- 首先,你需要将
-
MongoAutoConfiguration
:- 这个类是 MongoDB 自动配置的核心。它会检查类路径上是否存在
MongoClient
(来自 MongoDB Java 驱动)。 - 如果存在,它会尝试创建一个
MongoClient
bean。
- 这个类是 MongoDB 自动配置的核心。它会检查类路径上是否存在
-
MongoDataAutoConfiguration
:- 这个类负责配置 Spring Data MongoDB 特有的组件。
- 它会检查是否存在
MongoTemplate
(用于命令式编程) 或ReactiveMongoTemplate
(用于响应式编程)。 - 如果
MongoClient
和MongoDatabaseFactory
存在,并且没有用户自定义的MongoTemplate
(或ReactiveMongoTemplate
),它会自动配置一个。 - 它还会配置
MappingMongoConverter
用于对象与 BSON 文档之间的映射。 - 它也支持
@EnableMongoRepositories
的自动配置,扫描并创建MongoRepository
的实现。
-
属性驱动:
- 自动配置严重依赖于
application.properties
或application.yml
文件中的配置。Spring Boot 提供了一系列以spring.data.mongodb.*
为前缀的属性来定制连接。
- 自动配置严重依赖于
可以自定义的配置 (通过 application.properties
或 application.yml
):
以下是一些最常用的可配置属性:
-
基本连接信息:
spring.data.mongodb.uri
: 推荐使用此属性 ,它是一个标准的 MongoDB 连接字符串,可以包含所有连接信息。- 示例:
spring.data.mongodb.uri=mongodb://user:secret@host1:27017,host2:27017/mydb?replicaSet=myReplicaSet&readPreference=primary
- 示例:
- 如果未使用
uri
,则可以使用以下独立属性:spring.data.mongodb.host
: MongoDB 服务器主机名 (默认:localhost
)。spring.data.mongodb.port
: MongoDB 服务器端口 (默认:27017
)。spring.data.mongodb.database
: 要连接的数据库名称。如果未指定,它通常会根据uri
或其他上下文确定,或者你需要在代码中显式指定。spring.data.mongodb.username
: 连接数据库的用户名。spring.data.mongodb.password
: 连接数据库的密码。spring.data.mongodb.authentication-database
: 用于身份验证的数据库 (如果与spring.data.mongodb.database
不同)。
-
连接池选项 (通过
MongoClientSettings
) :Spring Boot 会根据属性配置底层的
MongoClientSettings
。一些常见的配置(尽管更高级的池配置可能需要自定义MongoClient
bean)可以通过uri
的参数或特定的嵌套属性来设置:uri
中的参数:例如?maxPoolSize=50&minPoolSize=5
spring.data.mongodb.additional-options.*
: 可以用来设置更底层的MongoClientOptions
,但这在较新版本中可能被更具体的属性或MongoClientSettingsBuilderCustomizer
所取代。
-
SSL/TLS 配置:
spring.data.mongodb.ssl.enabled=true
: 启用 SSL 连接。spring.data.mongodb.ssl.key-store
: 密钥库路径。spring.data.mongodb.ssl.key-store-password
: 密钥库密码。spring.data.mongodb.ssl.trust-store
: 信任库路径。spring.data.mongodb.ssl.trust-store-password
: 信任库密码。spring.data.mongodb.ssl.invalid-host-name-allowed=false
: 是否允许无效的主机名。
-
读写关注点 (Read/Write Concerns) 和读偏好 (Read Preference):
spring.data.mongodb.read-preference
: 设置读偏好 (e.g.,primary
,secondary
,nearest
)。spring.data.mongodb.write-concern
: 设置写关注点 (e.g.,ACKNOWLEDGED
,W1
,MAJORITY
)。- 这些通常在
uri
中设置更方便,例如?readPreference=secondary&writeConcern=majority
。
-
GridFS 配置:
spring.data.mongodb.gridfs.database
: GridFS 使用的数据库 (如果与主数据库不同)。spring.data.mongodb.gridfs.bucket
: GridFS bucket 的名称 (默认:fs
)。
更高级的自定义方式:
如果属性配置不足以满足需求,你可以通过定义自己的 bean 来覆盖自动配置:
-
自定义
MongoClient
:你可以完全控制
MongoClient
的创建过程,包括所有MongoClientSettings
。javaimport com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MongoConfig { @Bean public MongoClient mongoClient() { ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/mydatabase"); MongoClientSettings mongoClientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) // Add more custom settings here // .applicationName("MyCoolApp") // .readPreference(ReadPreference.secondaryPreferred()) .build(); return MongoClients.create(mongoClientSettings); } }
-
使用
MongoClientSettingsBuilderCustomizer
:这是一个更细粒度的方式,它允许你修改由自动配置创建的
MongoClientSettings.Builder
,而不是完全替换MongoClient
。javaimport com.mongodb.MongoClientSettings; import com.mongodb.ReadPreference; import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MongoCustomizerConfig { @Bean public MongoClientSettingsBuilderCustomizer mongoClientSettingsBuilderCustomizer() { return builder -> builder .applicationName("MySpringBootApp") .readPreference(ReadPreference.secondaryPreferred()) .retryWrites(true); } }
-
自定义
MongoTemplate
或MappingMongoConverter
:如果你需要自定义对象映射行为或
MongoTemplate
的某些方面,也可以提供自己的 bean 定义。javaimport org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; // ... other imports @Configuration public class MongoTemplateConfig { // Assuming MongoDatabaseFactory is auto-configured or defined elsewhere @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter converter) { // You can customize the converter here if needed // For example, setting a custom TypeMapper or custom converters return new MongoTemplate(mongoDbFactory, converter); } // Example of customizing the converter // @Bean // public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context) { // DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); // MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, context); // // Remove _class field // converter.setTypeMapper(new DefaultMongoTypeMapper(null)); // // Add custom converters // // converter.setCustomConversions(...); // return converter; // } }
通过这些机制,Spring Boot 提供了从简单属性配置到完全自定义 bean 定义的灵活性,以适应各种 MongoDB 连接需求。通常情况下,使用 application.properties
或 application.yml
中的 spring.data.mongodb.uri
是最简单和推荐的方式。