配置
你可以使用以下配置来创建并注册一个 MongoTemplate 的实例,如下例所示:
- 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):接收一个封装了MongoClient对象、数据库名称、用户名和密码的MongoDbFactory对象。
- 
MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个用于映射的MongoConverter。
在创建 MongoTemplate / ReactiveMongoTemplate 时,你可能还希望设置其他可选属性,例如默认的 WriteResultCheckingPolicy、WriteConcern、ReadPreference 以及下面列出的其他属性。
默认读取偏好
如果没有通过 Query 定义其他偏好,则应用于读取操作的默认读取偏好。
WriteResultChecking 策略
在开发过程中,如果从任何 MongoDB 操作返回的 com.mongodb.WriteResult 包含错误,记录日志或抛出异常是非常方便的。在开发过程中很容易忘记这样做,最终导致应用程序看起来运行成功,但实际上数据库并没有按照预期进行修改。你可以将 MongoTemplate 的 WriteResultChecking 属性设置为以下值之一:EXCEPTION 或 NONE,分别表示抛出 Exception 或不执行任何操作。默认情况下,WriteResultChecking 的值为 NONE。
默认写关注
如果尚未通过更高级别的驱动程序(例如 com.mongodb.client.MongoClient)进行指定,你可以设置 MongoTemplate 用于写操作的 com.mongodb.WriteConcern 属性。如果未设置 WriteConcern 属性,则默认为 MongoDB 驱动程序的 DB 或 Collection 设置中的值。
WriteConcernResolver
在更高级的场景中,如果您希望基于每个操作(如删除、更新、插入和保存操作)设置不同的 WriteConcern 值,可以在 MongoTemplate 上配置一个名为 WriteConcernResolver 的策略接口。由于 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,这些回调可以通过模板 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(...));
	// ...
}