30. 使用 NoSQL 技术

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

30.1 Redis

Redis是缓存,消息代理和功能丰富的键值存储。 Spring Boot 为JedisClient 端库提供了基本的自动配置,并在Spring Data Redis的基础上提供了抽象。有一个spring-boot-starter-data-redis'Starter'用于以方便的方式收集依赖项。

30.1.1 连接到 Redis

您可以像注入其他任何 Spring Bean 一样注入自动配置的RedisConnectionFactoryStringRedisTemplate或 vanilla RedisTemplate实例。默认情况下,实例将尝试使用localhost:6379连接到 Redis 服务器:

@Component
public class MyBean {

    private StringRedisTemplate template;

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

    // ...

}

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

30.2 MongoDB

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

30.2.1 连接到 MongoDB 数据库

您可以注入自动配置的org.springframework.data.mongodb.MongoDbFactory来访问 Mongo 数据库。默认情况下,实例将尝试使用 URL mongodb://localhost/test连接到 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 并配置其他设置,例如副本集

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

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.Mongo bean 而不是MongoDbFactory

如果要完全控制构建 MongoDB 连接,也可以声明自己的MongoDbFactoryMongo bean。

30.2.2 MongoTemplate

Spring Data Mongo 提供了一个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。

30.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 findByNameAndCountryAllIgnoringCase(String name, String country);

}

Tip

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

Tip

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

30.2.4 嵌入式 Mongo

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

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

Note

如果未配置自定义端口,则嵌入式支持默认情况下将使用随机端口(而不是 27017)。

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

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

30.3 Neo4j

Neo4j是开放源代码的 NoSQL 图形数据库,它使用由一类关系关联的节点的丰富数据模型,比传统的 rdbms 方法更适合于连接的大数据。 Spring Boot 为 Neo4j 的使用提供了许多便利,包括spring-boot-starter-data-neo4j'Starter'。

30.3.1 连接到 Neo4j 数据库

您可以像注入其他任何 Spring Bean 一样注入自动配置的Neo4jSessionSessionNeo4jOperations实例。默认情况下,实例将尝试使用localhost:7474连接到 Neo4j 服务器:

@Component
public class MyBean {

    private final Neo4jTemplate neo4jTemplate;

    @Autowired
    public MyBean(Neo4jTemplate neo4jTemplate) {
        this.neo4jTemplate = neo4jTemplate;
    }

    // ...

}

您可以添加自己的org.neo4j.ogm.config.Configuration @Bean,从而完全控制配置。此外,添加类型为Neo4jOperations@Bean也会禁用自动配置。

您可以通过spring.data.neo4j.*属性配置要使用的用户和凭据:

spring.data.neo4j.uri=http://my-server:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=secret

30.3.2 使用嵌入式模式

如果您将org.neo4j:neo4j-ogm-embedded-driver添加到应用程序的依赖项中,则 Spring Boot 将自动配置 Neo4j 的进程内嵌入式实例,该实例在应用程序关闭时不会保留任何数据。您可以使用spring.data.neo4j.embedded.enabled=false显式禁用该模式。您还可以为嵌入式模式启用持久性:

spring.data.neo4j.uri=file://var/tmp/graph.db

Note

Neo4j OGM 嵌入式驱动程序不提供 Neo4j 内核。希望用户手动提供此依赖关系,有关更多详细信息,请参见the documentation

30.3.3 Neo4jSession

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

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

30.3.4 Spring Data Neo4j 存储库

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

实际上,Spring Data JPA 和 Spring Data Neo4j 都共享相同的通用基础架构。因此,您可以使用以前的 JPA 示例,并假设City现在是 Neo4j OGM @NodeEntity而不是 JPA @Entity,它将以相同的方式工作。

Tip

您可以使用@EntityScanComments 自定义实体扫描位置。

要启用存储库支持(并可选地支持@Transactional),请在 Spring 配置中添加以下两个 Comments:

@EnableNeo4jRepositories(basePackages = "com.example.myapp.repository")
@EnableTransactionManagement

30.3.5Repositories 示例

package com.example.myapp.domain;

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

public interface CityRepository extends GraphRepository<City> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndCountry(String name, String country);

}

Tip

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

30.4 Gemfire

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

30.5 Solr

Apache Solr是搜索引擎。 Spring Boot 为 Solr 5Client 端库提供了基本的自动配置,并在Spring Data Solr的基础上提供了抽象。有一个spring-boot-starter-data-solr'Starter'用于方便地收集依赖项。

30.5.1 连接到 Solr

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

@Component
public class MyBean {

    private SolrClient solr;

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

    // ...

}

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

30.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

30.6 Elasticsearch

Elasticsearch是一个开源,分布式,实时搜索和分析引擎。 Spring Boot 在Spring Data Elasticsearch提供的基础上为 Elasticsearch 和抽象提供了基本的自动配置。有一个spring-boot-starter-data-elasticsearch'Starter'用于以方便的方式收集依赖项。 Spring Boot 还支持Jest

30.6.1 使用 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。

30.6.2 使用 Spring Data 连接到 Elasticsearch

您可以像注入其他任何 Spring Bean 一样注入自动配置的ElasticsearchTemplate或 Elasticsearch Client实例。默认情况下,实例将嵌入本地内存服务器(在 Elasticsearch 中为Node),并将当前工作目录用作服务器的主目录。在此设置中,第一件事是告诉 Elasticsearch 将文件存储在何处:

spring.data.elasticsearch.properties.path.home=/foo/bar

另外,您可以通过将spring.data.elasticsearch.cluster-nodes设置为以逗号分隔的“ host:port”列表来切换到远程服务器(即TransportClient)。

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

    private ElasticsearchTemplate template;

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

    // ...

}

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

30.6.3 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

30.7 Cassandra

Cassandra是一个开放源代码的分布式数据库 Management 系统,旨在处理许多商品服务器上的大量数据。 Spring Boot 在Spring Data Cassandra提供的基础上为 Cassandra 和抽象提供了自动配置。有一个spring-boot-starter-data-cassandra'Starter'用于方便地收集依赖项。

30.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
@Component
public class MyBean {

    private CassandraTemplate template;

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

    // ...

}

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

30.7.2 Spring Data Cassandra 存储库

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

Tip

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

30.8 Couchbase

Couchbase是开放源代码,分布式,多模型,NoSQL,面向文档的数据库,已针对交互式应用程序进行了优化。 Spring Boot 在Spring Data Couchbase提供的基础上为 Couchbase 和抽象提供了自动配置。有一个spring-boot-starter-data-couchbase'Starter'用于方便地收集依赖项。

30.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.*属性以获取更多详细信息。

30.8.2 Spring Data Couchbase 存储库

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

只要* default * CouchbaseConfigurer可用,就可以像使用其他任何 Spring Bean 一样注入自动配置的CouchbaseTemplate实例(在启用了如上所述的沙发床支持时会发生这种情况)。

@Component
public class MyBean {

    private final CouchbaseTemplate template;

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

    // ...

}

您可以在自己的配置中定义一些 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实现。

30.9 LDAP

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

Spring Data LDAP提供 LDAP 抽象。有一个spring-boot-starter-data-ldap'Starter',以方便的方式收集依赖项。

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

30.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;
    }

    // ...

}

30.9.3 嵌入式内存 LDAP 服务器

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

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

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

如果您的 Classpath 上有一个schema.ldif文件,它将用于初始化服务器。如果要从其他资源加载初始化脚本,也可以使用spring.ldap.embedded.ldif属性。

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

上一章 首页 下一章