Spring连接到MongoDB的几种方法

Doker官网:Doker 多克

一、概述

使用MongoDB和Spring时的首要任务之一是使用IoC容器创建com.MongoDB.client.MongoClient对象。有两种主要方法可以做到这一点,要么使用基于Java的bean元数据,要么使用使用基于XML的bean元数据。以下各节将对两者进行讨论。

二、使用基于Java的元数据注册Mongo实例

以下示例显示了使用基于Java的bean元数据注册com.mongodb.client.MongoClient实例的示例:

@Configuration
public class AppConfig {

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

这种方法允许您使用标准的com.mongodb.client.MongoClient实例,容器使用Spring的MongoClientFactoryBean。与直接实例化com.mongodb.client.MongoClient实例相比,FactoryBean还有一个额外的优势,即还为容器提供了ExceptionTranslator实现,该实现将mongodb异常转换为Spring的可移植DataAccessException层次结构中的异常,用于用@Repository注释注释的数据访问类。Spring的DAO支持特性中描述了这种层次结构和@Repository的使用。

以下示例显示了一个基于Java的bean元数据示例,该元数据支持@Repository注释类上的异常转换:

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

要访问MongoClientFactoryBean在其他@Configuration类或您自己的类中创建的com.mongodb.client.MongoClient对象,请使用私有的@Autowired MongoClient MongoClient;领域

三、MongoDB数据库工厂接口

虽然com.mongodb.client.MongoClient是mongodb驱动程序API的入口点,但连接到特定的mongodb数据库实例需要额外的信息,例如数据库名称以及可选的用户名和密码。有了这些信息,您可以获得com.mongodb.client.mongodb对象,并访问特定mongodb数据库实例的所有功能。Spring提供org.springframework.data.mongodb.core.MongoDatabaseFactory接口,如以下列表所示,用于引导数据库连接:

public interface MongoDatabaseFactory {

  MongoDatabase getDatabase() throws DataAccessException;

  MongoDatabase getDatabase(String dbName) throws DataAccessException;
}

以下部分展示了如何将容器与基于Java或基于XML的元数据一起使用,以配置MongoDB Factory接口的实例。反过来,您可以使用MongoDB数据库工厂实例来配置MongoTemplate。

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

public class MongoApp {

  private static final Log log = LogFactory.getLog(MongoApp.class);

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

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

    mongoOps.insert(new Person("Joe", 34));

    log.info(mongoOps.findOne(new Query(where("name").is("Joe")), Person.class));

    mongoOps.dropCollection("person");
  }
}

粗体代码突出显示了SimpleMongoClientDbFactory的使用,这是入门部分中显示的列表之间的唯一区别。

四、注册MongoDatabaseFactory

要在容器中注册MongoDB工厂实例,您需要编写与前面代码列表中突出显示的代码非常相似的代码。下面的列表显示了一个简单的示例:

@Configuration
public class MongoConfiguration {

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

MongoDB Server第3代在连接到数据库时更改了身份验证模型。因此,一些可用于身份验证的配置选项不再有效。您应该使用MongoClient特定的选项通过MongoCredential设置凭据,以提供身份验证数据,如以下示例所示:

@Configuration
public class ApplicationContextEventTestsAppConfig 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)));
        });
  }
}

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

@Configuration
@PropertySource("classpath:/com/myapp/mongodb/config/mongo.properties")
public class ApplicationContextEventTestsAppConfig 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);
    });
  }
}

大家好,我是Doker品牌的Sinbad,欢迎点赞和评论,您的鼓励是我们持续更新的动力!欢迎加微信进入技术群聊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值