30. 使用 NoSQL 技术
Spring Data 提供了其他项目,可帮助您访问各种 NoSQL 技术,包括MongoDB,Neo4J,Elasticsearch,Solr,Redis,Gemfire,Cassandra,Couchbase和LDAP。 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 一样注入自动配置的RedisConnectionFactory
,StringRedisTemplate
或 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.host
和spring.data.mongodb.port
。在这种情况下,应使用spring.data.mongodb.uri
提供所有配置。
Tip
如果未指定spring.data.mongodb.port
,则使用默认值27017
。您可以简单地从上面的示例中删除此行。
Tip
如果您不使用 Spring Data Mongo,则可以注入com.mongodb.Mongo
bean 而不是MongoDbFactory
。
如果要完全控制构建 MongoDB 连接,也可以声明自己的MongoDbFactory
或Mongo
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
您可以使用@EntityScan
Comments 自定义文档扫描位置。
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。
您可以声明自己的IMongodConfig
和IRuntimeConfig
bean 来控制 Mongo 实例的配置和日志记录路由。
30.3 Neo4j
Neo4j是开放源代码的 NoSQL 图形数据库,它使用由一类关系关联的节点的丰富数据模型,比传统的 rdbms 方法更适合于连接的大数据。 Spring Boot 为 Neo4j 的使用提供了许多便利,包括spring-boot-starter-data-neo4j
'Starter'。
30.3.1 连接到 Neo4j 数据库
您可以像注入其他任何 Spring Bean 一样注入自动配置的Neo4jSession
,Session
或Neo4jOperations
实例。默认情况下,实例将尝试使用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
您可以使用@EntityScan
Comments 自定义实体扫描位置。
要启用存储库支持(并可选地支持@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-name
和contact-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 存储库受到更多限制,并且需要使用@Query
Commentsfinder 方法。
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 和一些配置,您可以很容易地获得Bucket
和Cluster
。 spring.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,以覆盖自动配置提供的那些:
-
名为
couchbaseTemplate
的CouchbaseTemplate
@Bean
-
名为
couchbaseIndexManager
的IndexManager
@Bean
-
名为
couchbaseCustomConversions
的CustomConversions
@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.base
和spring.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
定义您的自定义属性类型或对象类。