最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

使用 MongoDB 和 Spring 时,首要任务之一是使用 IoC 容器创建对象。 有两种主要方法可以做到这一点,一种是使用基于 Java 的 Bean 元数据,另一种是使用基于 XML 的 Bean 元数据。MongoClientSpring中文文档

对于那些不熟悉如何使用基于 Java 的 Bean 元数据而不是基于 XML 的元数据来配置 Spring 容器的人,请参阅此处参考文档中的高级介绍以及此处的详细文档。
对于那些不熟悉如何使用基于 Java 的 Bean 元数据而不是基于 XML 的元数据来配置 Spring 容器的人,请参阅此处参考文档中的高级介绍以及此处的详细文档。

注册Mongo实例

以下示例显示了注册 A 实例的示例:MongoClientSpring中文文档

注册MongoClient
@Configuration
public class AppConfig {

  /*
   * Use the standard Mongo driver API to create a com.mongodb.client.MongoClient instance.
   */
   public @Bean com.mongodb.client.MongoClient mongoClient() {
       return com.mongodb.client.MongoClients.create("mongodb://localhost:27017");
   }
}
@Configuration
public class AppConfig {

  /*
   * Use the standard Mongo driver API to create a com.mongodb.client.MongoClient instance.
   */
   public @Bean com.mongodb.reactivestreams.client.MongoClient mongoClient() {
       return com.mongodb.reactivestreams.client.MongoClients.create("mongodb://localhost:27017");
   }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation=
"
http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Default bean name is 'mongo' -->
    <mongo:mongo-client host="localhost" port="27017"/>

</beans>

这种方法允许你使用标准实例,容器使用 Spring 的 /. 与直接实例化实例相比,它还有一个额外的优势,即还为容器提供了一个实现,该实现将MongoDB异常转换为Spring的可移植层次结构中的异常,用于使用注释注释的数据访问类。 Spring 的 DAO 支持功能中描述了这种层次结构和用法。MongoClientMongoClientFactoryBeanReactiveMongoClientFactoryBeanMongoClientFactoryBeanExceptionTranslatorDataAccessException@Repository@RepositorySpring中文文档

以下示例显示了一个基于 Java 的 Bean 元数据示例,该元数据支持对带注释的类进行异常转换:@RepositorySpring中文文档

注册 viaMongoClientMongoClientFactoryBean / ReactiveMongoClientFactoryBean
@Configuration
public class AppConfig {

    /*
     * Factory bean that creates the com.mongodb.client.MongoClient instance
     */
     public @Bean MongoClientFactoryBean mongo() {
          MongoClientFactoryBean mongo = new MongoClientFactoryBean();
          mongo.setHost("localhost");
          return mongo;
     }
}
@Configuration
public class AppConfig {

    /*
     * Factory bean that creates the com.mongodb.reactivestreams.client.MongoClient instance
     */
     public @Bean ReactiveMongoClientFactoryBean mongo() {
          ReactiveMongoClientFactoryBean mongo = new ReactiveMongoClientFactoryBean();
          mongo.setHost("localhost");
          return mongo;
     }
}

若要访问由其他类或您自己的类创建的对象,请使用字段。MongoClientFactoryBean@Configurationprivate @Autowired MongoClient mongoClient;Spring中文文档

MongoDatabaseFactory 接口

虽然是MongoDB驱动程序API的入口点,但连接到特定的MongoDB数据库实例需要其他信息,例如数据库名称以及可选的用户名和密码。 使用该信息,您可以获取对象并访问特定MongoDB数据库实例的所有功能。 Spring 提供了 & 接口,如下面的列表所示,用于引导与数据库的连接:MongoClientMongoDatabaseorg.springframework.data.mongodb.core.MongoDatabaseFactoryorg.springframework.data.mongodb.core.ReactiveMongoDatabaseFactorySpring中文文档

public interface MongoDatabaseFactory {

  MongoDatabase getDatabase() throws DataAccessException;

  MongoDatabase getDatabase(String dbName) throws DataAccessException;
}
public interface ReactiveMongoDatabaseFactory {

  Mono<MongoDatabase> getDatabase() throws DataAccessException;

  Mono<MongoDatabase> getDatabase(String dbName) throws DataAccessException;
}

以下各节介绍如何将容器与基于 Java 或基于 XML 的元数据结合使用来配置接口实例。 反过来,您可以使用 / 实例来配置 / 。MongoDatabaseFactoryMongoDatabaseFactoryReactiveMongoDatabaseFactoryMongoTemplateReactiveMongoTemplateSpring中文文档

您可以在标准 Java 代码中使用它们,而不是使用 IoC 容器创建模板的实例,如下所示:Spring中文文档

public class MongoApplication {

  public static void main(String[] args) throws Exception {

    MongoOperations mongoOps = new MongoTemplate(new SimpleMongoClientDatabaseFactory(MongoClients.create(), "database"));

    // ...
  }
}

粗体代码突出显示了 的用法,并且是入门部分中显示的列表之间的唯一区别。 选择作为选择的入口点时使用。SimpleMongoClientDbFactorySimpleMongoClientDbFactorycom.mongodb.client.MongoClientSpring中文文档

public class ReactiveMongoApplication {

  public static void main(String[] args) throws Exception {

    ReactiveMongoOperations mongoOps = new MongoTemplate(new SimpleReactiveMongoDatabaseFactory(MongoClients.create(), "database"));

    // ...
  }
}

注册MongoDatabaseFactory / ReactiveMongoDatabaseFactory

若要向容器注册 / 实例,请编写与上一节中突出显示的代码非常相似的代码。 以下列表显示了一个简单的示例:MongoDatabaseFactoryReactiveMongoDatabaseFactorySpring中文文档

@Configuration
public class MongoConfiguration {

  @Bean
  public MongoDatabaseFactory mongoDatabaseFactory() {
    return new SimpleMongoClientDatabaseFactory(MongoClients.create(), "database");
  }
}
@Configuration
public class ReactiveMongoConfiguration {

  @Bean
  public ReactiveMongoDatabaseFactory mongoDatabaseFactory() {
    return new SimpleReactiveMongoDatabaseFactory(MongoClients.create(), "database");
  }
}

MongoDB Server 第 3 代在连接到数据库时更改了身份验证模型。 因此,某些可用于身份验证的配置选项不再有效。 应使用特定于 -specific 的选项来设置凭据以提供身份验证数据,如以下示例所示:MongoClientMongoCredentialSpring中文文档

@Configuration
public class MongoAppConfig extends AbstractMongoClientConfiguration {

  @Override
  public String getDatabaseName() {
    return "database";
  }

  @Override
  protected void configureClientSettings(Builder builder) {

    builder
        .credential(MongoCredential.createCredential("name", "db", "pwd".toCharArray()))
        .applyToClusterSettings(settings  -> {
          settings.hosts(singletonList(new ServerAddress("127.0.0.1", 27017)));
        });
  }
}
<mongo:db-factory dbname="database" />

当基于 XML 的配置中使用的用户名和密码凭据包含保留字符(如 、 、 或 . 以下示例显示了编码的凭据: → 有关详细信息,请参阅 RFC 3986 的第 2.2 节:%@,m0ng0@dmin:mo_res:bw6},Qsdxx@admin@databasem0ng0%40dmin:mo_res%3Abw6%7D%2CQsdxx%40admin@databaseSpring中文文档

如果需要在用于创建 的实例上配置其他选项,可以参考现有 Bean,如以下示例所示。为了显示另一种常见的使用模式,下面的列表显示了属性占位符的使用,它允许您参数化配置和创建:com.mongodb.client.MongoClientSimpleMongoClientDbFactoryMongoTemplateSpring中文文档

@Configuration
@PropertySource("classpath:/com/myapp/mongodb/config/mongo.properties")
public class MongoAppConfig extends AbstractMongoClientConfiguration {

  @Autowired
  Environment env;

  @Override
  public String getDatabaseName() {
    return "database";
  }

  @Override
  protected void configureClientSettings(Builder builder) {

    builder.applyToClusterSettings(settings -> {
    settings.hosts(singletonList(
          new ServerAddress(env.getProperty("mongo.host"), env.getProperty("mongo.port", Integer.class))));
    });

    builder.applyToConnectionPoolSettings(settings -> {

      settings.maxConnectionLifeTime(env.getProperty("mongo.pool-max-life-time", Integer.class), TimeUnit.MILLISECONDS)
          .minSize(env.getProperty("mongo.pool-min-size", Integer.class))
          .maxSize(env.getProperty("mongo.pool-max-size", Integer.class))
          .maintenanceFrequency(10, TimeUnit.MILLISECONDS)
          .maintenanceInitialDelay(11, TimeUnit.MILLISECONDS)
          .maxConnectionIdleTime(30, TimeUnit.SECONDS)
          .maxWaitTime(15, TimeUnit.MILLISECONDS);
    });
  }
}
<context:property-placeholder location="classpath:/com/myapp/mongodb/config/mongo.properties"/>

<mongo:mongo-client host="${mongo.host}" port="${mongo.port}">
  <mongo:client-settings connection-pool-max-connection-life-time="${mongo.pool-max-life-time}"
    connection-pool-min-size="${mongo.pool-min-size}"
    connection-pool-max-size="${mongo.pool-max-size}"
    connection-pool-maintenance-frequency="10"
    connection-pool-maintenance-initial-delay="11"
    connection-pool-max-connection-idle-time="30"
    connection-pool-max-wait-time="15" />
</mongo:mongo-client>

<mongo:db-factory dbname="database" mongo-ref="mongoClient"/>

<bean id="anotherMongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
  <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>