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 为LettuceJedisClient 端库提供了基本的自动配置,以及Spring Data Redis提供的对它们的抽象。

有一个spring-boot-starter-data-redis“启动程序”,以方便的方式收集依赖项。默认情况下,它使用Lettuce。该启动程序可以处理传统应用程序和响应式应用程序。

Tip

我们还提供spring-boot-starter-data-redis-reactive“Starter”,以与其他具有 Reactive 支持的 Store 保持一致。

31.1.1 连接到 Redis

您可以像注入其他任何 Spring Bean 一样注入自动配置的RedisConnectionFactoryStringRedisTemplate或香草RedisTemplate实例。默认情况下,该实例尝试连接到localhost:6379的 Redis 服务器。下面的 Lists 显示了这种 Bean 的示例:

@Component
public class MyBean {

	private StringRedisTemplate template;

	@Autowired
	public MyBean(StringRedisTemplate template) {
		this.template = template;
	}

	// ...

}

Tip

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

如果添加自己的任何自动配置类型的@Bean,它将替换默认值(除非RedisTemplate,但排除基于 Bean 名称redisTemplate而不是其类型,则除外)。默认情况下,如果commons-pool2在 Classpath 上,则将得到一个池化连接工厂。

31.2 MongoDB

MongoDB是一个开源 NoSQL 文档数据库,它使用类似 JSON 的架构而不是传统的基于表的关系数据。 Spring Boot 为使用 MongoDB 提供了许多便利,包括spring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive“启动器”。

31.2.1 连接到 MongoDB 数据库

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

import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

	private final MongoDbFactory mongo;

	@Autowired
	public MyBean(MongoDbFactory mongo) {
		this.mongo = mongo;
	}

	// ...

	public void example() {
		DB db = mongo.getDb();
		// ...
	}

}

您可以设置spring.data.mongodb.uri属性来更改 URL 并配置其他设置,例如* replica set *,如以下示例所示:

spring.data.mongodb.uri=mongodb://user:[emailprotected]:12345,mongo2.example.com:23456/test

另外,只要您使用 Mongo 2.x,就可以指定host/port。例如,您可以在application.properties中声明以下设置:

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

如果您定义了自己的MongoClient,它将用于自动配置合适的MongoDbFactorycom.mongodb.MongoClientcom.mongodb.client.MongoClient均受支持。

Note

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

Tip

如果未指定spring.data.mongodb.port,则使用默认值27017。您可以从前面显示的示例中删除此行。

Tip

如果您不使用 Spring Data Mongo,则可以注入com.mongodb.MongoClient bean 而不是MongoDbFactory。如果要完全控制构建 MongoDB 连接的方式,则还可以声明自己的MongoDbFactoryMongoClient bean。

Note

如果使用 Reactive 驱动程序,则 SSL 需要 Netty。如果 Netty 可用并且尚未自定义要使用的工厂,则自动配置会自动配置该工厂。

31.2.2 MongoTemplate

Spring Data MongoDB提供的MongoTemplate类的设计与 Spring 的JdbcTemplate非常相似。与JdbcTemplate一样,Spring Boot 为您自动配置一个 Bean 来注入模板,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final MongoTemplate mongoTemplate;

	@Autowired
	public MyBean(MongoTemplate mongoTemplate) {
		this.mongoTemplate = mongoTemplate;
	}

	// ...

}

有关完整的详细信息,请参见MongoOperations Javadoc

31.2.3 Spring Data MongoDB 存储库

Spring Data 包括对 MongoDB 的存储库支持。与前面讨论的 JPA 存储库一样,基本原理是根据方法名称自动构造查询。

实际上,Spring Data JPA 和 Spring Data MongoDB 共享相同的通用基础架构。您可以从前面的 JPA 示例开始,并假设City现在是 Mongo 数据类而不是 JPA @Entity,它的工作方式相同,如以下示例所示:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

	Page<City> findAll(Pageable pageable);

	City findByNameAndStateAllIgnoringCase(String name, String state);

}

Tip

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

Tip

有关 Spring Data MongoDB 的完整详细信息,包括其丰富的对象 Map 技术,请参阅其reference documentation

31.2.4 嵌入式 Mongo

Spring Boot 为Embedded Mongo提供自动配置。要在您的 Spring Boot 应用程序中使用它,请在de.flapdoodle.embed:de.flapdoodle.embed.mongo上添加一个依赖项。

可以通过设置spring.data.mongodb.port属性来配置 Mongo 侦听的端口。要使用随机分配的空闲端口,请使用 0 值。由MongoAutoConfiguration创建的MongoClient自动配置为使用随机分配的端口。

Note

如果未配置自定义端口,则默认情况下,嵌入式支持使用随机端口(而不是 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 数据库

要访问 Neo4j 服务器,您可以注入自动配置的org.neo4j.ogm.session.Session。默认情况下,该实例尝试使用 Bolt 协议连接到localhost:7687处的 Neo4j 服务器。以下示例显示如何注入 Neo4j Session

@Component
public class MyBean {

	private final Session session;

	@Autowired
	public MyBean(Session session) {
		this.session = session;
	}

	// ...

}

您可以通过设置spring.data.neo4j.*属性来配置要使用的 uri 和凭据,如以下示例所示:

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

您可以通过添加org.neo4j.ogm.config.Configuration @Bean来完全控制会话的创建。另外,添加类型为SessionFactory@Bean会禁用自动配置,并提供完全控制权。

31.3.2 使用嵌入式模式

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

Note

由于嵌入式 Neo4j OGM 驱动程序本身不提供 Neo4j 内核,因此您必须自己声明org.neo4j:neo4j作为依赖项。有关兼容版本的列表,请参考Neo4j OGM 文档

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

如上所述,如果嵌入式驱动程序和 Neo4j 内核位于 Classpath 中,则数据 Neo4j 测试自动使用嵌入式 Neo4j 实例。

Note

您可以通过在配置中提供数据库文件的路径来启用嵌入式模式的持久性。 spring.data.neo4j.uri=file://var/tmp/graph.db

31.3.3 Neo4jSession

默认情况下,如果您正在运行 Web 应用程序,则会话将绑定到线程以进行请求的整个处理(即,它使用“在视图中打开会话”模式)。如果您不希望出现这种情况,请将以下行添加到您的application.properties文件中:

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

31.3.4 Spring Data Neo4j 存储库

Spring Data 包括对 Neo4j 的存储库支持。

Spring Data Neo4j 与许多其他 Spring Data 模块一样,与 Spring Data JPA 共享公共基础结构。您可以使用前面的 JPA 示例,并将City定义为 Neo4j OGM @NodeEntity而不是 JPA @Entity,并且存储库抽象以相同的方式工作,如以下示例所示:

package com.example.myapp.domain;

import java.util.Optional;

import org.springframework.data.neo4j.repository.*;

public interface CityRepository extends Neo4jRepository<City, Long> {

	Optional<City> findOneByNameAndState(String name, String state);

}

spring-boot-starter-data-neo4j“启动器”启用存储库支持以及事务 Management。您可以通过分别在@Configuration -bean 上使用@EnableNeo4jRepositories@EntityScan来定制位置以查找存储库和实体。

Tip

有关 Spring Data Neo4j 的完整详细信息,包括其对象 Map 技术,请参阅reference documentation

31.4 Gemfire

Spring Data Gemfire提供了方便使用 Spring 的便捷工具,用于访问Pivotal Gemfire数据 Management 平台。有一个spring-boot-starter-data-gemfire“启动器”,用于以方便的方式收集依赖项。 Gemfire 当前没有自动配置支持,但是您可以使用单个 Comments:@EnableGemfireRepositories启用 Spring Data Repositories。

31.5 Solr

Apache Solr是搜索引擎。 Spring Boot 为 Solr 5 Client 端库提供了基本的自动配置,并由Spring Data Solr提供了对它的抽象。有一个spring-boot-starter-data-solr“启动程序”,用于以方便的方式收集依赖项。

31.5.1 连接到 Solr

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

@Component
public class MyBean {

	private SolrClient solr;

	@Autowired
	public MyBean(SolrClient solr) {
		this.solr = solr;
	}

	// ...

}

如果添加自己的SolrClient类型的@Bean,它将替换默认值。

31.5.2 Spring Data Solr 存储库

Spring Data 包括对 Apache Solr 的存储库支持。与前面讨论的 JPA 存储库一样,基本原理是根据方法名称自动为\构造查询。

实际上,Spring Data JPA 和 Spring Data Solr 共享相同的通用基础结构。您可以从以前的 JPA 示例开始,并假设City现在是@SolrDocument类而不是 JPA @Entity,它的工作方式相同。

Tip

有关 Spring Data Solr 的完整详细信息,请参阅reference documentation

31.6 Elasticsearch

Elasticsearch是开源,分布式,RESTful 搜索和分析引擎。 Spring Boot 为 Elasticsearch 提供了基本的自动配置。

Spring Boot 支持多个 HTTP Client 端:

  • 官方 Java“低级”和“高级” REST Client 端

  • Jest

Spring Data Elasticsearch仍在使用传输 Client 端,您可以从spring-boot-starter-data-elasticsearch“ Starter”开始使用。

31.6.1 通过 REST Client 端连接到 Elasticsearch

Elasticsearch 附带了两个不同的 REST Client 端,可用于查询集群:“低级”Client 端和“高级”Client 端。

如果您对 Classpath 具有org.elasticsearch.client:elasticsearch-rest-client依赖关系,Spring Boot 将自动配置并注册一个RestClient bean,默认情况下它针对localhost:9200。您可以进一步调整RestClient的配置方式,如以下示例所示:

spring.elasticsearch.rest.uris=http://search.example.com:9200
spring.elasticsearch.rest.username=user
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,则可以注入自动配置的JestClient,默认情况下以localhost:9200为目标。您可以进一步调整 Client 端的配置方式,如以下示例所示:

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

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

static class HttpSettingsCustomizer implements HttpClientConfigBuilderCustomizer {

	@Override
	public void customize(HttpClientConfig.Builder builder) {
		builder.maxTotalConnection(100).defaultMaxTotalConnectionPerRoute(5);
	}

}

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

31.6.3 使用 Spring 数据连接到 Elasticsearch

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

spring.data.elasticsearch.cluster-nodes=localhost:9300
@Component
public class MyBean {

	private final ElasticsearchTemplate template;

	public MyBean(ElasticsearchTemplate template) {
		this.template = template;
	}

	// ...

}

如果添加自己的ElasticsearchTemplateTransportClient @Bean,它将替换默认值。

31.6.4 Spring Data Elasticsearch 存储库

Spring Data 包括对 Elasticsearch 的存储库支持。与前面讨论的 JPA 存储库一样,基本原理是根据方法名称自动为您构造查询。

实际上,Spring Data JPA 和 Spring Data Elasticsearch 共享相同的通用基础架构。您可以从前面的 JPA 示例开始,并假设City现在是 Elasticsearch @Document类而不是 JPA @Entity,它的工作方式相同。

Tip

有关 Spring Data Elasticsearch 的完整详细信息,请参阅reference documentation

31.7 Cassandra

Cassandra是一个开放源代码的分布式数据库 Management 系统,旨在处理许多商品服务器上的大量数据。 Spring Boot 为 Cassandra 提供自动配置,并由Spring Data Cassandra提供最高级的抽象。有一个spring-boot-starter-data-cassandra“启动程序”,用于以方便的方式收集依赖项。

31.7.1 连接到 Cassandra

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

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

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

以下代码 Lists 显示了如何注入 Cassandra bean:

@Component
public class MyBean {

	private CassandraTemplate template;

	@Autowired
	public MyBean(CassandraTemplate template) {
		this.template = template;
	}

	// ...

}

如果添加自己的CassandraTemplate类型的@Bean,它将替换默认值。

31.7.2 Spring Data Cassandra 存储库

Spring Data 包括对 Cassandra 的基本存储库支持。当前,这比前面讨论的 JPA 存储库受到更多限制,并且需要使用@QueryComments finder 方法。

Tip

有关 Spring Data Cassandra 的完整详细信息,请参阅reference documentation

31.8 Couchbase

Couchbase是开放源代码,分布式,多模型的 NoSQL 面向文档的数据库,已针对交互式应用程序进行了优化。 Spring Boot 为 Couchbase 提供自动配置,并由Spring Data Couchbase提供最高级的抽象。有spring-boot-starter-data-couchbasespring-boot-starter-data-couchbase-reactive个“启动程序”,以方便的方式收集依赖项。

31.8.1 连接到 Couchbase

您可以通过添加 Couchbase SDK 和一些配置来获得BucketClusterspring.couchbase.*属性可用于自定义连接。通常,您提供引导主机,存储桶名称和密码,如以下示例所示:

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

Tip

您至少需要提供*引导主机,在这种情况下,存储区名称为default,密码为空字符串。另外,您可以定义自己的org.springframework.data.couchbase.config.CouchbaseConfigurer @Bean来控制整个配置。

还可以自定义某些CouchbaseEnvironment设置。例如,以下配置更改了用于打开新的Bucket的超时并启用了 SSL 支持:

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

查看spring.couchbase.env.*属性以获取更多详细信息。

31.8.2 Spring Data Couchbase 存储库

Spring Data 包括对 Couchbase 的存储库支持。有关 Spring Data Couchbase 的完整详细信息,请参阅reference documentation

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

以下示例显示了如何注入 Couchbase bean:

@Component
public class MyBean {

	private final CouchbaseTemplate template;

	@Autowired
	public MyBean(CouchbaseTemplate template) {
		this.template = template;
	}

	// ...

}

您可以在自己的配置中定义一些 Bean,以覆盖自动配置提供的那些:

  • 名称为couchbaseTemplateCouchbaseTemplate @Bean

  • 名为couchbaseIndexManagerIndexManager @Bean

  • 名称为couchbaseCustomConversionsCustomConversions @Bean

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

@Configuration
public class SomeConfiguration {

	@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
	public CustomConversions myCustomConversions() {
		return new CustomConversions(...);
	}

	// ...

}

Tip

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

31.9 LDAP

LDAP(轻型目录访问协议)是一种开放的,与供应商无关的行业标准应用程序协议,用于通过 IP 网络访问和维护分布式目录信息服务。 Spring Boot 为任何兼容的 LDAP 服务器提供自动配置,并从UnboundID支持嵌入式内存 LDAP 服务器。

Spring Data LDAP提供 LDAP 抽象。有一个spring-boot-starter-data-ldap“启动程序”,以方便的方式收集依赖项。

31.9.1 连接到 LDAP 服务器

要连接到 LDAP 服务器,请确保声明对spring-boot-starter-data-ldap“ Starter”或spring-ldap-core的依赖关系,然后在 application.properties 中声明服务器的 URL,如以下示例所示:

spring.ldap.urls=ldap://myserver:1235
spring.ldap.username=admin
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 的完整详细信息,请参阅reference documentation

您还可以像使用其他任何 Spring Bean 一样注入自动配置的LdapTemplate实例,如以下示例所示:

@Component
public class MyBean {

	private final LdapTemplate template;

	@Autowired
	public MyBean(LdapTemplate template) {
		this.template = template;
	}

	// ...

}

31.9.3 嵌入式内存 LDAP 服务器

出于测试目的,Spring Boot 支持从UnboundID自动配置内存中的 LDAP 服务器。要配置服务器,请将依赖项添加到com.unboundid:unboundid-ldapsdk并声明base-dn属性,如下所示:

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

Note

可以定义多个 base-dn 值,但是,由于可分辨的名称通常包含逗号,因此必须使用正确的符号来定义它们。

在 yaml 文件中,您可以使用 yaml 列表符号:

spring.ldap.embedded.base-dn:
- dc=spring,dc=io
- dc=pivotal,dc=io

在属性文件中,必须将索引包括在属性名称中:

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属性。

默认情况下,使用标准架构来验证LDIF个文件。您可以通过设置spring.ldap.embedded.validation.enabled属性完全关闭验证。如果您具有自定义属性,则可以使用spring.ldap.embedded.validation.schema定义您的自定义属性类型或对象类。

31.10 InfluxDB

InfluxDB是开放源代码的时间序列数据库,已优化用于在操作监视,应用程序度量,物联网传感器数据和实时分析等领域中快速,高可用性地存储和检索时间序列数据。

31.10.1 连接到 InfluxDB

只要influxdb-javaClient 端位于 Classpath 上并且设置了数据库的 URL,Spring Boot 就会自动配置InfluxDB实例,如以下示例所示:

spring.influx.url=http://172.0.0.1:8086

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

InfluxDB 依赖 OkHttp。如果需要在后台调整 http Client 端InfluxDB的使用,则可以注册InfluxDbOkHttpClientBuilderProvider bean。