4.11。使用NoSQL技術
Spring Data提供了其他項目來幫助您訪問各種NoSQL
技術,包括:
- Redis
- MongoDB
- Neo4J
- Solr
- Elasticsearch
- Cassandra
- Couchbase
- LDAP
- InfluxDB
Spring Boot為Redis
,MongoDB
,Neo4j
,Elasticsearch
,Solr
, Cassandra
,Couchbase
和LDAP
提供自動配置。您可以使用其他項目,但必須自己進行配置。請參閱相應的參考文檔。
4.11.1。Redis
Redis是一個緩存,消息代理和功能豐富的鍵值存儲。Spring Boot為Lettuce
和Jedis
客戶端庫以及Spring Data Redis為Lettuce和Jedis提供的最基本的抽象,提供了基本的自動配置。
spring-boot-starter-data-redis
啟動器可以方便地收集依賴關系。默認情況下,它使用 Lettuce
。該啟動程序可以處理傳統應用程序和響應式應用程序。
我們還提供了一個spring-boot-starter-data-redis-reactive
啟動器,可與其他存儲保持一致,並提供響應性支持。
連接到Redis
您可以像注入其他任何Spring Bean一樣注入自動配置的RedisConnectionFactory
,StringRedisTemplate
或Vanilla RedisTemplate
實例。默認情況下,實例嘗試連接到Redis服務器localhost:6379
。下面的清單顯示了這種Bean的示例:
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}
您還可以注冊任意數量的實現LettuceClientConfigurationBuilderCustomizer
的Bean,以使用更高級的自定義。如果您使用Jedis
,JedisClientConfigurationBuilderCustomizer
也可以使用。
如果添加自己任何一種自動配置類型的@Bean,它將替換默認類型(除非是RedisTemplate
,當基於Bean名稱redisTemplate
而不是其類型排除時)。默認情況下,如果commons-pool2
在類路徑上,則會得到一個池化連接工廠。
4.11.2。MongoDB
MongoDB是一個開源NoSQL文檔數據庫,它使用類似JSON的架構而不是傳統的基於表的關系數據。Spring Boot為MongoDB的使用提供了許多便利,包括spring-boot-starter-data-mongodb
和spring-boot-starter-data-mongodb-reactive
啟動器。
連接到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:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
另外,只要您使用Mongo 2.x,就可以指定 host/port
。例如,您可以在application.properties中聲明以下設置:
spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017
如果定義了自己的MongoClient
,它將用於自動配置合適的MongoDbFactory
。支持com.mongodb.MongoClient
和com.mongodb.client.MongoClient
。
如果使用Mongo3.0 Java驅動程序,spring.data.mongodb.host
和spring.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並且尚未自定義要使用的工廠,則自動配置會自動配置該工廠。
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;
}
// ...
}
Spring Data MongoDB Repositories
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);
}
您可以使用@EntityScan
注解來自定義文檔掃描位置。
嵌入式Mongo
Spring Boot為Embedded Mongo提供自動配置。要在您的Spring Boot應用程序中使用它,請添加de.flapdoodle.embed:de.flapdoodle.embed.mongo
依賴。
可以通過設置spring.data.mongodb.port
屬性來配置Mongo偵聽的端口。要使用隨機分配的空閑端口,請使用值0
。MongoAutoConfiguration
創建的MongoClient
被自動配置為使用隨機分配的端口。
如果未配置自定義端口,則默認情況下,嵌入式支持會使用隨機端口
(而不是27017
)。
如果類路徑上有SLF4J
,則Mongo產生的輸出將自動路由到名為org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo
的記錄器。
您可以聲明自己的IMongodConfig
和IRuntimeConfig
bean來控制Mongo實例的配置和日志記錄路由。可以通過聲明DownloadConfigBuilderCustomizer
bean 來定制下載配置。
4.11.3。Neo4j
Neo4j是一個開源NoSQL圖形數據庫,它使用通過一級關系連接的節點的豐富數據模型,與傳統的RDBMS方法相比,它更適合於連接大數據。Spring Boot為Neo4j的使用提供了許多便利,包括spring-boot-starter-data-neo4j
啟動器。
連接到Neo4j數據庫
要訪問Neo4j服務器,您可以注入自動配置的org.neo4j.ogm.session.Session
。默認情況下,實例嘗試localhost:7687
使用Bolt
協議連接到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或org.neo4j.ogm.session.SessionFactory
bean 來完全控制會話的創建。
使用嵌入式模式
如果添加org.neo4j:neo4j-ogm-embedded-driver
到應用程序的依賴項,Spring Boot會自動配置Neo4j的進程內嵌入式實例,該實例在應用程序關閉時不會保留任何數據。
由於嵌入式Neo4j OGM驅動程序本身不提供Neo4j內核,因此您必須自己聲明org.neo4j:neo4j
為依賴項。有關兼容版本的列表,請參閱Neo4j OGM文檔。
當類路徑上有多個驅動程序時,嵌入式驅動程序優先於其他驅動程序。您可以通過設置spring.data.neo4j.embedded.enabled=false
顯式禁用嵌入式模式。
如果嵌入式驅動程序和Neo4j內核位於上述類路徑上,則Data Neo4j Tests會自動使用嵌入式Neo4j實例。
您可以通過在配置中提供數據庫文件的路徑來啟用嵌入式模式的持久性,例如,spring.data.neo4j.uri=file://var/tmp/graph.db
。
使用原生類型
Neo4j-OGM可以將某些類型(例如java.time.*
中的類型)映射到基於String屬性或Neo4j提供的原生類型之一。出於向后兼容的原因,Neo4j-OGM的默認設置是使用基於String的表示形式。要使用原生類型,請添加依賴項org.neo4j:neo4j-ogm-bolt-native-types
或org.neo4j:neo4j-ogm-embedded-native-types
,並配置spring.data.neo4j.use-native-types
屬性,如以下示例所示:
spring.data.neo4j.use-native-types=true
Neo4jSession
默認情況下,如果您正在運行Web應用程序,則會話將綁定到線程以進行請求的整個處理(即,它使用“在視圖中打開會話”模式)。如果您不希望出現這種情況,請將以下行添加到您的application.properties文件中:
spring.data.neo4j.open-in-view=false
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
啟動器啟用對存儲庫的支持以及事務管理。您可以通過在@Configuration
bean 上分別使用@EnableNeo4jRepositories
和@EntityScan
來定制查找存儲庫和實體的位置。
有關Spring Data Neo4j的完整詳細信息,包括其對象映射技術,請參閱參考文檔。
4.11.4。Solr
Apache Solr是一個搜索引擎。Spring Boot為Solr 5客戶端庫提供了基本的自動配置,並由Spring Data Solr在其之上提供了抽象。spring-boot-starter-data-solr
“啟動器”可以方便地收集依賴關系。
連接到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,它將替換默認值。
Spring Data Solr存儲庫
Spring Data包括對Apache Solr的存儲庫支持。與前面討論的JPA存儲庫一樣,基本原理是根據方法名稱自動為您構建查詢。
實際上,Spring Data JPA和Spring Data Solr共享相同的通用基礎結構。您可以從以前的JPA示例開始,假設現在City是一個@SolrDocument
類,而不是JPA @Entity,它的工作方式相同。
4.11.5。Elasticsearch
Elasticsearch
是一個開源,分布式,RESTful搜索和分析引擎。Spring Boot為Elasticsearch提供了基本的自動配置。
Spring Boot支持多個客戶端:
- 官方Java“低級”和“高級” REST客戶端
- Spring Data Elasticsearch提供的
ReactiveElasticsearchClient
傳輸客戶端仍然可用,但是Spring Data Elasticsearch和Elasticsearch本身已棄用了它的支持。它將在將來的版本中刪除。Spring Boot提供了專用的 spring-boot-starter-data-elasticsearch
啟動器。
由於Elasticsearch和Spring Data Elasticsearch為REST客戶端提供了官方支持,因此Jest客戶端也已被棄用。
使用REST客戶端連接到Elasticsearch
Elasticsearch附帶了兩個可用於查詢集群的REST客戶端:“低級”客戶端和“高級”客戶端。
如果類路徑上有org.elasticsearch.client:elasticsearch-rest-client
依賴,Spring Boot將自動配置並注冊一個RestClient
bean 默認為localhost:9200
的target。您可以進一步調整RestClient
配置方式,如以下示例所示:
spring.elasticsearch.rest.uris=https://search.example.com:9200
spring.elasticsearch.rest.read-timeout=10s
spring.elasticsearch.rest.username=user
spring.elasticsearch.rest.password=secret
您還可以注冊任意數量的RestClientBuilderCustomizer
Bean,以實現更高級的自定義。要完全控制注冊,請定義一個RestClient
bean。
如果類路徑有org.elasticsearch.client:elasticsearch-rest-high-level-client
依賴,Spring Boot將自動配置一個RestHighLevelClient
,包裝現有的RestClient
bean,重新使用其HTTP配置。
使用反應式REST客戶端連接到Elasticsearch
Spring Data Elasticsearch附帶的ReactiveElasticsearchClient
實例以響應方式查詢Elasticsearch實例。它建立在WebFlux的WebClient
基礎上,因此spring-boot-starter-elasticsearch
和spring-boot-starter-webflux
依賴項對於啟用此支持都是有用的。
默認情況下,Spring Boot將自動配置並注冊一個ReactiveElasticsearchClient
bean 作為localhost:9200
的target 。您可以進一步調整其配置,如以下示例所示:
spring.data.elasticsearch.client.reactive.endpoints=search.example.com:9200
spring.data.elasticsearch.client.reactive.use-ssl=true
spring.data.elasticsearch.client.reactive.socket-timeout=10s
spring.data.elasticsearch.client.reactive.username=user
spring.data.elasticsearch.client.reactive.password=secret
如果配置屬性不夠,並且您想完全控制客戶端配置,則可以注冊一個自定義ClientConfiguration
bean。
使用Jest連接到Elasticsearch
現在,Spring Boot支持官方的RestHighLevelClient
,已廢棄Jest支持。
如果Jest在類路徑上,則可以注入默認情況下目標為localhost:9200
的自動配置的JestClient
。您可以進一步調整客戶端的配置方式,如以下示例所示:
spring.elasticsearch.jest.uris=https://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。
使用Spring Data連接到Elasticsearch
要連接到Elasticsearch,必須定義一個RestHighLevelClient
bean,它由Spring Boot自動配置或由應用程序手動提供(請參閱前面的部分)。有了此配置后,ElasticsearchRestTemplate
可以像其他任何Spring bean一樣被注入 ,如以下示例所示:
@Component
public class MyBean {
private final ElasticsearchRestTemplate template;
public MyBean(ElasticsearchRestTemplate template) {
this.template = template;
}
// ...
}
在存在spring-data-elasticsearch
和使用WebClient
(通常為spring-boot-starter-webflux
)所需的依賴項的情況下,Spring Boot還可以自動配置ReactiveElasticsearchClient
和ReactiveElasticsearchTemplateas
Bean。它們與其他REST客戶端是等效的。
Spring Data Elasticsearch存儲庫
Spring Data包括對Elasticsearch的存儲庫支持。與前面討論的JPA存儲庫一樣,基本原理是根據方法名稱自動為您構造查詢。
實際上,Spring Data JPA和Spring Data Elasticsearch共享相同的通用基礎架構。您可以從以前的JPA示例開始,假設現在City是Elasticsearch @Document類而不是JPA @Entity,它的工作方式相同。
Spring Boot使用ElasticsearchRestTemplate
或ReactiveElasticsearchTemplate
bean 支持經典和反應式Elasticsearch存儲庫。給定所需的依賴項,最有可能由Spring Boot自動配置這些bean。
如果您希望使用自己的模板來支持Elasticsearch存儲庫,則可以添加自己的ElasticsearchRestTemplate
或ElasticsearchOperations
@Bean(只要命名為elasticsearchTemplate
)。同樣適用於ReactiveElasticsearchTemplate
和ReactiveElasticsearchOperations
,Bean名稱為reactiveElasticsearchTemplate
。
您可以選擇使用以下屬性禁用存儲庫支持:
spring.data.elasticsearch.repositories.enabled=false
4.11.6。Cassandra
Cassandra是一個開源的分布式數據庫管理系統,旨在處理許多商用服務器上的大量數據。Spring Boot為Cassandra提供自動配置,並由Spring Data Cassandra在其之上提供抽象。spring-boot-starter-data-cassandra
“啟動器”可以方便地收集依賴關系。
連接到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
您還可以注冊任意數量的ClusterBuilderCustomizer
Bean,以實現更高級的自定義。
以下代碼顯示了如何注入Cassandra
bean:
@Component
public class MyBean {
private CassandraTemplate template;
@Autowired
public MyBean(CassandraTemplate template) {
this.template = template;
}
// ...
}
如果添加自己的CassandraTemplate
@Bean,它將替換默認值。
Spring Data Cassandra存儲庫
Spring Data包括對Cassandra的基本存儲庫支持。當前,此功能比前面討論的JPA存儲庫更受限制,需要使用@Query
來注解finder方法。
4.11.7。Couchbase
Couchbase是一個開源,分布式,多模型的NoSQL面向文檔的數據庫,已針對交互式應用程序進行了優化。Spring Boot為Couchbase提供自動配置,並由Spring Data Couchbase在其之上提供抽象。spring-boot-starter-data-couchbase
和spring-boot-starter-data-couchbase-reactive
“啟動器”方便的收集依賴關系。
連接到Couchbase
您可以通過添加Couchbase SDK和一些配置來獲得Bucket和Cluster。spring.couchbase.*
屬性可用於自定義連接。通常,您提供bootstrap主機,bucket名稱和密碼,如以下示例所示:
spring.couchbase.bootstrap-hosts=my-host-1,192.168.1.123
spring.couchbase.bucket.name=my-bucket
spring.couchbase.bucket.password=secret
您至少需要提供bootstrap主機,在這種情況下,bucket名稱為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.*
屬性以獲取更多詳細信息。
Spring Data Couchbase存儲庫
Spring Data包括對Couchbase的存儲庫支持。
您可以像使用任何其他Spring Bean一樣注入自動配置的CouchbaseTemplate
實例,前提是默認的 CouchbaseConfigurer
可以使用(如前所述,啟用Couchbase支持時會發生這種情況)。
以下示例顯示了如何注入Couchbase
bean:
@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(proxyBeanMethods = false)
public class SomeConfiguration {
@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
public CustomConversions myCustomConversions() {
return new CustomConversions(...);
}
// ...
}
如果您想完全繞過Spring Data Couchbase的自動配置,請提供您自己的org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration
實現。
4.11.8。LDAP
LDAP(輕量級目錄訪問協議)是一種開放的,與供應商無關的行業標准應用協議,用於通過IP網絡訪問和維護分布式目錄信息服務。Spring Boot為任何兼容的LDAP服務器提供自動配置,並使用UnboundID
支持嵌入式內存LDAP服務器。
LDAP抽象由Spring Data LDAP提供。spring-boot-starter-data-ldap
“啟動器”可以方便地收集依賴關系。
連接到LDAP服務器
要連接到LDAP服務器,請確保聲明spring-boot-starter-data-ldap
“啟動器” 或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
屬性。
將根據這些設置自動配置LdapContextSource
。如果您需要對其進行自定義(例如為了使用PooledContextSource
),則仍可以注入自動配置的LdapContextSource。確保將您的定制ContextSource標記為@Primary
,以便自動配置的LdapTemplate
使用它。
Spring Data LDAP存儲庫
Spring Data包括對LDAP的存儲庫支持。。
您還可以像使用其他任何Spring Bean一樣注入自動配置的LdapTemplate
實例,如以下示例所示:
@Component
public class MyBean {
private final LdapTemplate template;
@Autowired
public MyBean(LdapTemplate template) {
this.template = template;
}
// ...
}
嵌入式內存LDAP服務器
出於測試目的,Spring Boot支持使用UnboundID自動配置內存中的LDAP服務器。要配置服務器,請添加依賴項com.unboundid:unboundid-ldapsdk
並聲明spring.ldap.embedded.base-dn
屬性,如下所示:
spring.ldap.embedded.base-dn=dc=spring,dc=io
可以定義多個base-dn
值,但是,由於可分辨的名稱通常包含逗號,因此必須使用正確的符號來定義它們。
在yaml文件中,您可以使用:
spring.ldap.embedded.base-dn:
- dc=spring,dc=io
- dc=pivotal,dc=io
在properties文件中,必須將索引包括在屬性名稱中:
spring.ldap.embedded.base-dn[0]=dc=spring,dc=io
spring.ldap.embedded.base-dn[1]=dc=pivotal,dc=io
默認情況下,服務器在隨機端口上啟動並觸發常規LDAP支持。無需指定spring.ldap.urls
屬性。
如果您的類路徑中有一個schema.ldif
文件,它將用於初始化服務器。如果要從其他資源加載初始化腳本,則也可以使用spring.ldap.embedded.ldif
屬性。
默認情況下,使用標准模式來驗證LDIF文件。您可以通過設置spring.ldap.embedded.validation.enabled
屬性來完全關閉驗證。如果您具有定制屬性,則可以用spring.ldap.embedded.validation.schema
來定義定制屬性類型或對象類。
4.11.9。InfluxDB
InfluxDB是一個開源的時間序列數據庫,已優化用於在操作監視,應用程序度量,物聯網傳感器數據和實時分析等領域中快速,高可用性地存儲和檢索時間序列數據。
連接到InfluxDB
如果influxdb-java
客戶端位於類路徑上並且設置了數據庫的URL,Spring Boot會自動配置一個InfluxDB實例,如以下示例所示:
spring.influx.url=https://172.0.0.1:8086
如果與InfluxDB的連接需要用戶和密碼,則可以相應地設置spring.influx.user
和spring.influx.password
屬性。
InfluxDB依賴OkHttp
。如果需要在后台調整http客戶端InfluxDB的使用,則可以注冊一個InfluxDbOkHttpClientBuilderProvider
bean。