31、使用 NoSQL 技术

Spring Data 提供了其他项目,可以帮助您访问各种 NoSQL 技术,包括 MongoDBNeo4JElasticsearchSolrRedisGemfireCassandraCouchbaseLDAP。Spring Boot 为 Redis、MongoDB、Neo4j、Elasticsearch、Solr、Cassandra、Couchbase 和 LDAP 提供了自动配置。您也可以使用其他项目,但您需要自行配置他们。请参阅 projects.spring.io/spring-data 中相应的参考文档。

31.1、Redis

Redis 是一个集缓存、消息代理和键值存储等丰富功能的数据库。Spring Boot 为 LettuceJedis 客户端类库提供了基本自动配置,Spring Data Redis 为他们提供了上层抽象。

使用 spring-boot-starter-data-redis starter 可方便地引入相关依赖。默认情况下,它使用 Lettuce。该 starter 可处理传统应用程序和响应式应用程序。

提示

我们还提供了一个 spring-boot-starter-data-redis-reactive starter,以便与其他带有响应式支持的存储保持一致。

31.1.1、连接 Redis

您可以像所有 Spring Bean 一样注入自动配置的 RedisConnectionFactoryStringRedisTemplate 或普通的 RedisTemplate 实例。默认情况下,实例将尝试在 localhost:6379 上连接 Redis 服务器,以下是 bean 示例:

  1. @Component
  2. public class MyBean {
  3. private StringRedisTemplate template;
  4. @Autowired
  5. public MyBean(StringRedisTemplate template) {
  6. this.template = template;
  7. }
  8. // ...
  9. }

提示

您还可以注册任意数量个实现了 LettuceClientConfigurationBuilderCustomizer 的 bean,以进行更高级的自定义。如果你使用 Jedis,则可以使用 JedisClientConfigurationBuilderCustomizer

如果您添加了自己的任何一个自动配置类型的 @Bean,它将替换默认设置(除了 RedisTemplate,由于排除是基于 bean 名称,而 redisTemplate 不是它的类型)。默认情况下,如果 commons-pool2 在 classpath 上,您将获得一个连接池工厂。

31.2、MongoDB

MongoDB 是一个开源的 NoSQL 文档数据库,其使用了类似 JSON 的模式(schema)来替代传统基于表的关系数据。Spring Boot 为 MongoDB 提供了几种便利的使用方式,包括 spring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive starter。

31.2.1、连接 MongoDB 数据库

您可以注入一个自动配置的 org.springframework.data.mongodb.MongoDbFactory 来访问 Mongo 数据库。默认情况下,该实例将尝试在 mongodb://localhost/test 上连接 MongoDB 服务器,以下示例展示了如何连接到 MongoDB 数据库:

  1. import org.springframework.data.mongodb.MongoDbFactory;
  2. import com.mongodb.DB;
  3. @Component
  4. public class MyBean {
  5. private final MongoDbFactory mongo;
  6. @Autowired
  7. public MyBean(MongoDbFactory mongo) {
  8. this.mongo = mongo;
  9. }
  10. // ...
  11. public void example() {
  12. DB db = mongo.getDb();
  13. // ...
  14. }
  15. }

您可以通过设置 spring.data.mongodb.uri 属性来更改 URL 和配置其他设置,如副本集(replica set):

  1. spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test

另外,只要您使用了 Mongo 2.x,请指定 host/port。比如,您可能要在 application.properties 中声明以下内容:

  1. spring.data.mongodb.host=mongoserver
  2. spring.data.mongodb.port=27017

如果您已经定义了自己的 MongoClient,它将被用于自动配置合适的 MongoDbFactory。支持 com.mongodb.MongoClientcom.mongodb.client.MongoClient

注意

如果您使用 Mongo 3.0 Java 驱动,则不支持 spring.data.mongodb.hostspring.data.mongodb.port。这种情况下,应该使用 spring.data.mongodb.uri 来提供所有配置。

提示

如果未指定 spring.data.mongodb.port,则使用默认值 27017。您可以将上述示例中的改行配置删除掉。

提示

如果您不使用 Spring Data Mongo,则可以注入 com.mongodb.MongoClient bean 来代替 MongoDbFactory。如果要完全控制建立 MongoDB 连接,您还可以声明自己的 MongoDbFactory 或者 MongoClient bean。

注意

如果您使用的是响应式驱动,则 SSL 需要 Netty。 如果 Netty 可用且 factory 尚未自定义,则自动配置会自动配置此 factory。

31.2.2、MongoTemplate

Spring Data Mongo 提供了一个 MongoTemplate 类,它的设计与 Spring 的 JdbcTemplate 非常相似。与 JdbcTemplate 一样,Spring Boot 会自动配置一个 bean,以便您能注入模板:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.data.mongodb.core.MongoTemplate;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class MyBean {
  6. private final MongoTemplate mongoTemplate;
  7. @Autowired
  8. public MyBean(MongoTemplate mongoTemplate) {
  9. this.mongoTemplate = mongoTemplate;
  10. }
  11. // ...
  12. }

更多详细信息,参照 MongoOperations Javadoc。

31.2.3、Spring Data MongoDB 资源库

Spring Data 包含了对 MongoDB 资源库(repository)的支持。与之前讨论的 JPA 资源库一样,基本原理是根据方法名称自动构建查询。

事实上,Spring Data JPA 和 Spring Data MongoDB 共享通用的底层代码,因此你可以拿之前提到的 JPA 示例作为基础,假设 City 现在是一个 Mongo 数据类,而不是一个 JPA @Entity,他们方式工作相同:

  1. package com.example.myapp.domain;
  2. import org.springframework.data.domain.*;
  3. import org.springframework.data.repository.*;
  4. public interface CityRepository extends Repository<City, Long> {
  5. Page<City> findAll(Pageable pageable);
  6. City findByNameAndStateAllIgnoringCase(String name, String state);
  7. }

提示

您可以使用 @EntityScan 注解来自定义文档扫描位置。

提示

有关 Spring Data MongoDB 的完整详细内容,包括其丰富的对象关系映射技术,请参考其参考文档

31.2.4、内嵌 Mongo

Spring Boot 提供了内嵌 Mongo 的自动配置。要在 Spring Boot 应用程序中使用它,请添加依赖 de.flapdoodle.embed:de.flapdoodle.embed.mongo

可以使用 spring.data.mongodb.port 属性来配置 Mongo 的监听端口。如果想随机分配空闲端口,请把值设置为 0。MongoAutoConfiguration 创建的 MongoClient 将自动配置随机分配的端口。

注意

如果您不配置一个自定义端口,内嵌支持将默认使用一个随机端口(而不是 27017)。

如果您的 classpath 上有 SLF4J,Mongo 产生的输出将自动路由到名为 org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo 的 logger。

您可以声明自己的 IMongodConfigIRuntimeConfig bean 来控制 Mongo 实例的配置和日志路由。

31.3、Neo4j

Neo4j 是一个开源的 NoSQL 图形数据库,它使用了一个节点由关系连接的富数据模型,比传统 RDBMS 的方式更适合连接大数据。Spring Boot 为 Neo4j 提供了便捷引入方式,包括 spring-boot-starter-data-neo4j starter。

31.3.1、连接 Neo4j 数据库

您可以像任何 Spring Bean 一样注入一个自动配置的 org.neo4j.ogm.session.Session。默认情况下, 该实例将尝试使用在 localhost:7687 上使用 Bolt 协议连接到 Neo4j 服务器,以下示例展示了如何注入 一个 Neo4j Session

  1. @Component
  2. public class MyBean {
  3. private final Session session;
  4. @Autowired
  5. public MyBean(Session session) {
  6. this.session = session;
  7. }
  8. // ...
  9. }

您可以通过配置 spring.data.neo4j.* 属性来设置 uri 和凭据:

  1. spring.data.neo4j.uri=bolt://my-server:7687
  2. spring.data.neo4j.username=neo4j
  3. spring.data.neo4j.password=secret

您可以通过添加自己的 org.neo4j.ogm.config.Configuration @Bean 来完全控制 session 创建。此外,添加 SessionFactory 类型的 @Bean 会禁用自动配置,因此您可以掌控所有。

31.3.2、使用内嵌模式

如果您将 org.neo4j:neo4j-ogm-embedded-driver 添加到应用程序的依赖中,Spring Boot 将自动配置一个进程内内嵌的 Neo4j 实例,当您的应用程序关闭时,该实例将不会保留任何数据。

注意

内嵌 Neo4j OGM 驱动本身不提供 Neo4j 您必须自己声明 org.neo4j:neo4j 依赖,请参考 Neo4j OGM 文档 获取兼容版本列表。

当 classpath 上有多个驱动时,内嵌驱动优先于其他驱动。您可以通过设置 spring.data.neo4j.embedded.enabled=false 来显式禁用内嵌模式。

如果内嵌驱动和 Neo4j 内核如上所述位于 classpath 上,则 Data Neo4j 测试 会自动使用内嵌 Neo4j 实例。

注意

您可以通过在配置中提供数据库文件路径来为内嵌模式启用持久化,例如:spring.data.neo4j.uri=file://var/tmp/graph.db

31.3.3、Neo4jSession

默认情况下,如果您正在运行 Web 应用程序,会话(session)将被绑定到当前请求的整个处理线程(即 Open Session in View 模式)。如果不希望此行为,您可以在 application.properties 中添加以下内容:

  1. spring.data.neo4j.open-in-view=false

31.3.4、Spring Data Neo4j 资源库

Spring Data 包括了对 Neo4j 资源库的支持。

Spring Data Neo4j 与 Spring Data JPA 共享相同的通用底层代码,因此您可以直接把之前的 JPA 示例作为基础,假设 City 现在是一个 Neo4j OGM @NodeEntity,而不是一个 JPA @Entity,并且资源库抽象以相同的方式工作:

  1. package com.example.myapp.domain;
  2. import java.util.Optional;
  3. import org.springframework.data.neo4j.repository.*;
  4. public interface CityRepository extends Neo4jRepository<City, Long> {
  5. Optional<City> findOneByNameAndState(String name, String state);
  6. }

spring-boot-starter-data-neo4j starter 支持资源库和事务管理。您可以在 @Configuration bean 上分别使用 @EnableNeo4jRepositories@EntityScan 来自定义位置以查找资源库和实体。

提示

有关 Spring Data Neo4j 的完整详细信息,包括其对象映射技术,请参阅参考文档

31.4、Gemfire

Spring Data Gemfire 提供了便捷的 Spring 整合工具,用于访问 Pivotal Gemfire 数据管理平台。 spring-boot-starter-data-gemfire starter 包含了相关依赖。目前没有针对 Gemfire 的自动配置支持,但您可以使用一个单独的注解(@EnableGemfireRepositories)来启用 Spring Data 资源库。

31.5、Solr

Apache Solr 是一个搜素引擎。Spring Boot 为 Solr 5 客户端类库提供了基本的自动配置,并且 Spring Data Solr 为其提供给了顶层抽象。相关的依赖包含在了 spring-boot-starter-data-solr starter 中。

31.5.1、连接 Solr

您可以像其他 Spring Bean 一样注入一个自动配置的 SolrClient 实例。默认情况下,该实例将尝试通过 localhost:8983/solr 连接到服务器,以下示例展示了如何注入一个 Solr bean:

  1. @Component
  2. public class MyBean {
  3. private SolrClient solr;
  4. @Autowired
  5. public MyBean(SolrClient solr) {
  6. this.solr = solr;
  7. }
  8. // ...
  9. }

如果您添加了自己的 SolrClient 类型的 @Bean,它将替换掉默认配置。

31.5.2、Spring Data Solr 资源库

Spring Data 包含了对 Apache Solr 资源库的支持。与之前讨论的 JPA 资源库一样,基本原理是根据方法名称自动构造查询。

事实上,Spring Data JPA 和 Spring Data Solr 共享了相同的通用底层代码,因此您可以使用之前的 JPA 示例作为基础,假设 City 现在是一个 @SolrDocument 类,而不是一个 JPA @Entity,它的工作方式相同。

提示

有关 Spring Data Solr 的完整详细内容,请参考其参考文档

31.6、Elasticsearch

Elasticsearch 是一个开源、分布式、RESTful 的实时搜索分析引擎。Spring Boot 为 Elasticsearch 提供了基本的自动配置。

Spring Boot 支持以下 HTTP 客户端:

  • 官方 Java Low Level(低级)High Level(高级) REST 客户端
  • Jest

Spring Data Elasticsearch 依旧使用传输客户端,您可以使用 spring-boot-starter-data-elasticsearch starter 引入使用它。

31.6.1、使用 REST 客户端连接 Elasticsearch

Elasticsearch 提供了两个可用于查询集群的 REST 客户端Low Level(低级)High Level(高级)

如果您的 classpath 上存在 org.elasticsearch.client:elasticsearch-rest-client 依赖,则 Spring Boot 将自动配置并注册默认目标为 localhost:9200RestClient bean。您可以进一步调整 RestClient 的配置,如下所示:

  1. spring.elasticsearch.rest.uris=http://search.example.com:9200
  2. spring.elasticsearch.rest.username=user
  3. spring.elasticsearch.rest.password=secret

您还可以注册实现任意数量的 RestClientBuilderCustomizer bean,以进行更高级的自定义。要完全控制注册流程,请定义 RestClient bean。

如果你 classpath 上有 org.elasticsearch.client:elasticsearch-rest-high-level-client 依赖,Spring Boot 将自动配置一个 RestHighLevelClient,它包装了所有现有的 RestClient bean,重用其 HTTP 配置。

31.6.2、使用 Jest 连接 Elasticsearch

如果您的 classpath 上存在 Jest,则可以注入一个默认目标为 localhost:9200 的自动配置 JestClient。您还可以进一步调整客户端配置:

  1. spring.elasticsearch.jest.uris=http://search.example.com:9200
  2. spring.elasticsearch.jest.read-timeout=10000
  3. spring.elasticsearch.jest.username=user
  4. spring.elasticsearch.jest.password=secret

您还可以注册任何数量实现了 HttpClientConfigBuilderCustomizer 的 bean,以进行更加高级的自定义。以下示例调整了其他 HTTP 设置:

  1. static class HttpSettingsCustomizer implements HttpClientConfigBuilderCustomizer {
  2. @Override
  3. public void customize(HttpClientConfig.Builder builder) {
  4. builder.maxTotalConnection(100).defaultMaxTotalConnectionPerRoute(5);
  5. }
  6. }

要完全控制注册流程,请定义一个 JestClient bean。

31.6.3、使用 Spring Data 连接 Elasticsearch

要连接 Elasticsearch,您必须提供一个或多个群集节点的地址。可以通过将 spring.data.elasticsearch.cluster-nodes 属性设置为以逗号分隔的 host:port 列表来指定地址。使用此配置,可以像其他 Spring bean 一样注入 ElasticsearchTemplateTransportClient,如下所示:

  1. @Component
  2. public class MyBean {
  3. private final ElasticsearchTemplate template;
  4. public MyBean(ElasticsearchTemplate template) {
  5. this.template = template;
  6. }
  7. // ...
  8. }

如果您添加了自己的 ElasticsearchTemplate 或者 TransportClient @Bean,则其将替代默认配置。

31.6.4、Spring Data Elasticsearch 资源库

Spring Data 包含了对 Elasticsearch 资源库的支持,与之前讨论的 JPA 资源库一样,其原理是根据方法名称自动构造查询。

事实上,Spring Data JPA 与 Spring Data Elasticsearch 共享了相同的通用底层代码,因此您可以使用之前的 JPA 示例作为基础,假设 City 此时是一个 Elasticsearch @Document 类,而不是一个 JPA @Entity,它以相同的方式工作。

提示

有关 Spring Data Elasticsearch 的完整详细内容,请参阅其参考文档

31.7、Cassandra

Cassandra 是一个开源的分布式数据库管理系统,旨在处理商用服务器上的大量数据。Spring Boot 为 Cassandra 提供了自动配置,且 Spring Data Cassandra 为其提供了顶层抽象。相关依赖包含在 spring-boot-starter-data-cassandra starter 中。

31.7.1、连接 Cassandra

您可以像其他 Spring Bean 一样注入一个自动配置的 CassandraTemplate 或 Cassandra Session 实例。spring.data.cassandra.* 属性可用于自定义连接。通常,您会提供 keyspace-namecontact-points属性:

  1. spring.data.cassandra.keyspace-name=mykeyspace
  2. spring.data.cassandra.contact-points=cassandrahost1,cassandrahost2

您还可以注册任意数量实现了 ClusterBuilderCustomizer 的 bean,以进行更高级的自定义。

以下代码展示了如何注入一个 Cassandra bean:

  1. @Component
  2. public class MyBean {
  3. private CassandraTemplate template;
  4. @Autowired
  5. public MyBean(CassandraTemplate template) {
  6. this.template = template;
  7. }
  8. // ...
  9. }

如果您添加了自己的类的为 @CassandraTemplate@Bean,则其将替代默认值。

31.7.2、Spring Data Cassandra 资源库

Spring Data 包含了基本的 Cassandra 资源库支持。目前,其限制要比之前讨论的 JPA 资源库要多,并且需要在 finder 方法上使用 @Query 注解。

提示

有关 Spring Data Cassandra 的完整详细内容,请参阅其参考文档

31.8、Couchbase

Couchbase 是一个开源、分布式多模型的 NoSQL 面向文档数据库,其针对交互式应用程序做了优化。Spring Boot 为 Couchbase 提供了自动配置,且 Spring Data Couchbase 为其提供了顶层抽象。相关的依赖包含在了 spring-boot-starter-data-couchbase starter 中。

31.8.1、连接 Couchbase

您可以通过添加 Couchbase SDK 和一些配置来轻松获取 BucketClusterspring.couchbase.* 属性可用于自定义连接。通常您会配置 bootstrap host、bucket name 和 password:

  1. spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123
  2. spring.couchbase.bucket.name=my-bucket
  3. spring.couchbase.bucket.password=secret

至少需要提供 bootstrap host,这种情况下,bucket name 为 default 且 password 为空字符串。或者,您可以定义自己的 org.springframework.data.couchbase.config.CouchbaseConfigurer @Bean 来控制整个配置。

也可以自定义一些 CouchbaseEnvironment 设置。例如,以下配置修改了打开一个新 Bucket 的超时时间和开启了 SSL 支持:

  1. spring.couchbase.env.timeouts.connect=3000
  2. spring.couchbase.env.ssl.key-store=/location/of/keystore.jks
  3. spring.couchbase.env.ssl.key-store-password=secret

查看 spring.couchbase.env.* 获取更多详细内容。

31.8.2、Spring Data Couchbase 资源库

Spring Data 包含了 Couchbase 资源库支持。有关 Spring Data Couchbase 的完整详细信息,请参阅其参考文档

您可以像使用其他 Spring Bean 一样注入自动配置的 CouchbaseTemplate 实例,前提是有一个默认的CouchbaseConfigurer(当您启用 Couchbase 支持时会发生这种情况,如之前所述)。

以下示例展示了如何注入一个 Couchbase bean:

  1. @Component
  2. public class MyBean {
  3. private final CouchbaseTemplate template;
  4. @Autowired
  5. public MyBean(CouchbaseTemplate template) {
  6. this.template = template;
  7. }
  8. // ...
  9. }

您可以在自己的配置中定义以下几个 bean,以覆盖自动配置提供的配置:

  • 一个名为 couchbaseTemplateCouchbaseTemplate @Bean
  • 一个名为 couchbaseIndexManagerIndexManager @Bean
  • 一个名为 couchbaseCustomConversionsCustomConversions @Bean

为了避免在自己的配置中硬编码这些名称,您可以重用 Spring Data Couchbase 提供的 BeanNames,例如,您可以自定义转换器,如下:

  1. @Configuration
  2. public class SomeConfiguration {
  3. @Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
  4. public CustomConversions myCustomConversions() {
  5. return new CustomConversions(...);
  6. }
  7. // ...
  8. }

提示

如果您想要安全绕开 Spring Data Couchbase 的自动配置,请提供自己的 org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration 实现。

31.9、LDAP

LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)是一个开放、厂商中立的行业标准应用协议,其通过 IP 网络访问和维护分布式目录信息服务。Spring Boot 为兼容 LDAP 服务器提供了自动配置,以及支持从 UnboundID 内嵌内存式 LDAP 服务器。

Spring Data LDAP 提供了 LDAP 抽象。相关依赖包含在了 spring-boot-starter-data-ldap starter 中。

31.9.1、连接 LDAP 服务器

要连接 LDAP 服务器,请确保您已经声明了 spring-boot-starter-data-ldap starter 或者 spring-ldap-core 依赖,然后在 application.properties 声明服务器的 URL:

  1. spring.ldap.urls=ldap://myserver:1235
  2. spring.ldap.username=admin
  3. spring.ldap.password=secret

如果需要自定义连接设置,您可以使用 spring.ldap.basespring.ldap.base-environment 属性。

LdapContextSource 将根据这些设置自动配置。如果您需要自定义它,例如使用一个 PooledContextSource,则仍然可以注入自动配置的 LdapContextSource。确保将自定义的 ContextSource 标记为 @Primary,以便自动配置的 LdapTemplate 能使用它。

31.9.2、Spring Data LDAP 资源库

Spring Data 包含了 LDAP 资源库支持。有关 Spring Data LDAP 的完整详细信息,请参阅其参考文档

您还可以像其他 Spring Bean 一样注入一个自动配置的 LdapTemplate 实例:

  1. @Component
  2. public class MyBean {
  3. private final LdapTemplate template;
  4. @Autowired
  5. public MyBean(LdapTemplate template) {
  6. this.template = template;
  7. }
  8. // ...
  9. }

31.9.3、内嵌内存式 LDAP 服务器

为了测试目的,Spring Boot 支持从 UnboundID 自动配置一个内存式 LDAP 服务器。要配置服务器,请添加 com.unboundid:unboundid-ldapsdk 依赖并声明一个 base-dn 属性:

  1. spring.ldap.embedded.base-dn=dc=spring,dc=io

注意

可以定义多个 base-dn 值,但是,由于名称包含逗号,存在歧义,因此必须使用正确的符号来定义它们。在 yaml 文件中,您可以使用 yaml 列表表示法:yaml spring.ldap.embedded.base-dn: - dc=spring,dc=io - dc=pivotal,dc=io在属性文件中,必须使用索引方式:ini spring.ldap.embedded.base-dn[0]=dc=spring,dc=io spring.ldap.embedded.base-dn[1]=dc=pivotal,dc=io

默认情况下,服务器将在一个随机端口上启动,并触发常规的 LDAP 支持(不需要指定 spring.ldap.urls 属性)。

如果您的 classpath 上存在一个 schema.ldif 文件,其将用于初始化服务器。如果您想从不同的资源中加载脚本,可以使用 spring.ldap.embedded.ldif 属性。

默认情况下,将使用一个标准模式(schema)来校验 LDIF 文件。您可以使用 spring.ldap.embedded.validation.enabled 属性来关闭所有校验。如果您有自定义的属性,则可以使用 spring.ldap.embedded.validation.schema 来定义自定义属性类型或者对象类。

31.10、InfluxDB

InfluxDB 是一个开源时列数据库,其针对运营监控、应用程序指标、物联网传感器数据和实时分析等领域中的时间序列数据在速度、高可用存储和检索方面进行了优化。

31.10.1、连接 InfluxDB

Spring Boot 自动配置 InfluxDB 实例,前提是 Influxdb-java 客户端在 classpath 上并且设置了数据库的 URL,如下所示:

  1. spring.influx.url=HTTP://172.0.0.1:8086

如果与 InfluxDB 的连接需要用户和密码,则可以相应地设置 spring.influx.userspring.influx.password 属性。

InfluxDB 依赖于 OkHttp。如果你需要调整 InfluxDB 在底层使用的 http 客户端,则可以注册一个 InfluxDbOkHttpClientBuilderProvider bean。