MongoDB に接続する

MongoDB と Spring を使用する場合の最初のタスクの 1 つは、IoC コンテナーを使用して MongoClient オブジェクトを作成することです。これを行うには、主に 2 つのメソッドがあります。Java ベースの Bean メタデータを使用するか、XML ベースの Bean メタデータを使用するかのいずれかです。

XML ベースのメタデータの代わりに Java ベースの Bean メタデータを使用して Spring コンテナーを構成する方法に詳しくない方は、こちらのリファレンスドキュメントの概要と、こちらの詳細ドキュメントを参照してください。

Mongo インスタンスの登録

次の例は、MongoClient のインスタンスを登録する例を示しています。

MongoClient の登録
  • 命令的

  • リアクティブ

  • XML

@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 の MongoClientFactoryBean/ReactiveMongoClientFactoryBean を使用するコンテナーで、標準の MongoClient インスタンスを使用できます。MongoClient インスタンスを直接インスタンス化する場合と比較して、FactoryBean には、MongoDB の例外を、@Repository アノテーションが付けられたデータアクセスクラスの Spring の移植可能な DataAccessException 階層の例外に変換する ExceptionTranslator 実装もコンテナーに提供できるという追加の利点があります。この階層と @Repository の使用については、"Spring の DAO サポート機能" で説明されています。

次の例は、@Repository アノテーション付きクラスでの例外変換をサポートする Java ベースの Bean メタデータの例を示しています。

MongoClientFactoryBean / ReactiveMongoClientFactoryBean 経由での MongoClient の登録
  • 命令的

  • リアクティブ

@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;
     }
}

他の @Configuration クラスまたは独自のクラスの FactoryBean によって作成された MongoClient オブジェクトにアクセスするには、private @Autowired MongoClient mongoClient; フィールドを使用します。

MongoDatabaseFactory インターフェース

MongoClient は MongoDB ドライバー API へのエントリポイントですが、特定の MongoDB データベースインスタンスに接続するには、データベース名やオプションのユーザー名とパスワードなどの追加情報が必要です。その情報を使用すると、MongoDatabase オブジェクトを取得し、特定の MongoDB データベースインスタンスのすべての機能にアクセスできます。Spring は、データベースへの接続をブートストラップするために、次のリストに示す org.springframework.data.mongodb.core.MongoDatabaseFactory および org.springframework.data.mongodb.core.ReactiveMongoDatabaseFactory インターフェースを提供します。

  • 命令的

  • リアクティブ

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 ベースのメタデータを持つコンテナーを使用して、MongoDatabaseFactory インターフェースのインスタンスを構成する方法を示します。次に、MongoDatabaseFactory / ReactiveMongoDatabaseFactory インスタンスを使用して MongoTemplate / ReactiveMongoTemplate を構成できます。

IoC コンテナーを使用してテンプレートのインスタンスを作成する代わりに、次のように標準 Java コードでテンプレートのインスタンスを使用できます。

  • 命令的

  • リアクティブ

public class MongoApplication {

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

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

    // ...
  }
}

太字のコードは SimpleMongoClientDbFactory の使用を強調しており、これが「入門」セクションに示されているリストとの唯一の違いです。エントリポイントとして com.mongodb.client.MongoClient を選択する場合は、SimpleMongoClientDbFactory を使用します。

public class ReactiveMongoApplication {

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

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

    // ...
  }
}

MongoDatabaseFactory / ReactiveMongoDatabaseFactory の登録

MongoDatabaseFactoryReactiveMongoDatabaseFactory インスタンスをコンテナーに登録するには、前のセクションで強調したものとほぼ同じコードを作成します。次のリストは簡単な例を示しています。

  • 命令的

  • リアクティブ

@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 では、DB に接続する際の認証モデルが変更されました。認証に使用できる構成オプションの一部は無効になります。次の例に示すように、MongoCredential 経由で資格情報を設定し、認証データを提供するには、MongoClient -specific オプションを使用する必要があります。

  • Java

  • XML

@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 ベースの構成で使用されるユーザー名とパスワードの資格情報は、:%@ や , などの予約文字が含まれる場合、URL エンコードする必要があります。次の例は、エンコードされた資格情報を示しています。m0ng0@dmin:mo_res:bw6},Qsdxx@admin@database → m0ng0%40dmin:mo_res%3Abw6%7D%2CQsdxx%40admin@database 詳細については、RFC 3986 のセクション 2.2 [IETF] (英語) を参照してください。

SimpleMongoClientDbFactory の作成に使用される com.mongodb.client.MongoClient インスタンスで追加のオプションを構成する必要がある場合は、次の例に示すように既存の Bean を参照できます。別の一般的な使用パターンを示すために、次のリストは、MongoTemplate の構成と作成をパラメーター化できるプロパティプレースホルダーの使用を示しています。

  • Java

  • XML

@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>