|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Data MongoDB 5.0.4! |
配置
您可以使用以下配置来创建并注册一个 MongoTemplate 实例,如下例所示:
MongoClient 对象并启用 Spring 的异常转换支持-
Imperative
-
Reactive
-
XML
@Configuration
class ApplicationConfiguration {
@Bean
MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
@Bean
MongoOperations mongoTemplate(MongoClient mongoClient) {
return new MongoTemplate(mongoClient, "geospatial");
}
}
@Configuration
class ReactiveApplicationConfiguration {
@Bean
MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
@Bean
ReactiveMongoOperations mongoTemplate(MongoClient mongoClient) {
return new ReactiveMongoTemplate(mongoClient, "geospatial");
}
}
<mongo:mongo-client host="localhost" port="27017" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongoClient" />
<constructor-arg name="databaseName" value="geospatial" />
</bean>
MongoTemplate 和 ReactiveMongoTemplate 有多个重载构造函数:
-
MongoTemplate(MongoClient mongo, String databaseName):接收MongoClient对象和默认数据库名称,用于执行操作。 -
MongoTemplate(MongoDatabaseFactory mongoDbFactory):接收一个 MongoDbFactory 对象,该对象封装了MongoClient对象、数据库名称以及用户名和密码。 -
MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个用于映射的MongoConverter。
在创建 MongoTemplate / ReactiveMongoTemplate 时,你可能还希望设置其他一些可选属性,例如默认的 WriteResultCheckingPolicy、WriteConcern、ReadPreference 以及下面列出的其他属性。
默认读取偏好
如果没有通过Query定义其他读取偏好,则应用于读取操作的默认读取偏好。
写入结果检查策略
在开发过程中,如果从任何 MongoDB 操作返回的 com.mongodb.WriteResult 包含错误,记录日志或抛出异常是非常方便的做法。在开发过程中很容易忘记这样做,结果导致应用程序看似成功运行,而实际上数据库并未按照预期进行修改。您可以将 WriteResultChecking 的 MongoTemplate 属性设置为以下值之一:EXCEPTION 或 NONE,分别表示抛出 Exception 或不执行任何操作。默认情况下,WriteResultChecking 的值为 NONE。
默认写入关注
如果尚未通过更高层级的驱动程序(例如 com.mongodb.client.MongoClient)指定,则可以设置 com.mongodb.WriteConcern 在写操作中使用的 MongoTemplate 属性。如果未设置 WriteConcern 属性,则默认使用 MongoDB 驱动程序中数据库或集合所配置的 WriteConcern。
写入关注解析器
对于更高级的场景,如果您希望在每次操作(如删除、更新、插入和保存操作)时设置不同的 WriteConcern 值,可以在 WriteConcernResolver 上配置一个名为 MongoTemplate 的策略接口。由于 MongoTemplate 用于持久化 POJO,WriteConcernResolver 允许您创建一种策略,将特定的 POJO 类映射到一个 WriteConcern 值。以下代码展示了 WriteConcernResolver 接口:
public interface WriteConcernResolver {
WriteConcern resolve(MongoAction action);
}
您可以使用 MongoAction 参数来确定 WriteConcern 的值,或者直接使用模板本身的值作为默认值。
MongoAction 包含正在写入的集合名称、POJO 的 java.lang.Class、转换后的 Document、操作类型(REMOVE、UPDATE、INSERT、INSERT_LIST 或 SAVE)以及一些其他上下文信息。
以下示例展示了两组类如何应用不同的 WriteConcern 设置:
public class MyAppWriteConcernResolver implements WriteConcernResolver {
@Override
public WriteConcern resolve(MongoAction action) {
if (action.getEntityType().getSimpleName().contains("Audit")) {
return WriteConcern.ACKNOWLEDGED;
} else if (action.getEntityType().getSimpleName().contains("Metadata")) {
return WriteConcern.JOURNALED;
}
return action.getDefaultWriteConcern();
}
}
发布实体生命周期事件
该模板会发布生命周期事件。 如果没有监听器存在,此功能可以被禁用。
@Bean
MongoOperations mongoTemplate(MongoClient mongoClient) {
MongoTemplate template = new MongoTemplate(mongoClient, "geospatial");
template.setEntityLifecycleEventsEnabled(false);
// ...
}
配置 EntityCallbacks
除了生命周期事件外,模板还会调用EntityCallbacks,这些回调可以通过模板 API 进行设置(如果未自动配置的话)。
-
Imperative
-
Reactive
@Bean
MongoOperations mongoTemplate(MongoClient mongoClient) {
MongoTemplate template = new MongoTemplate(mongoClient, "...");
template.setEntityCallbacks(EntityCallbacks.create(...));
// ...
}
@Bean
ReactiveMongoOperations mongoTemplate(MongoClient mongoClient) {
ReactiveMongoTemplate template = new ReactiveMongoTemplate(mongoClient, "...");
template.setEntityCallbacks(ReactiveEntityCallbacks.create(...));
// ...
}