使用 NoSQL 技術

Spring Data 提供了額外的專案,幫助您訪問各種 NoSQL 技術,包括

其中,Spring Boot 為 Cassandra、Couchbase、Elasticsearch、LDAP、MongoDB、Neo4j 和 Redis 提供了自動配置。此外,Spring Boot for Apache Geode 提供了 Apache Geode 的自動配置。您可以使用其他專案,但必須自行配置。請參閱 spring.io/projects/spring-data 上的相應參考文件。

Spring Boot 也為 InfluxDB 客戶端提供了自動配置,但該客戶端已棄用,推薦使用提供自身 Spring Boot 整合的新版 InfluxDB Java 客戶端

Redis

Redis 是一個快取、訊息代理和功能豐富的鍵值儲存。Spring Boot 為 LettuceJedis 客戶端庫以及 Spring Data Redis 在其上提供的抽象提供了基本自動配置。

提供了一個 spring-boot-starter-data-redis starter,用於方便地收集依賴。預設情況下,它使用 Lettuce。該 starter 支援傳統應用和響應式應用。

我們還提供了一個 spring-boot-starter-data-redis-reactive starter,以便與其他支援響應式的儲存保持一致。

連線到 Redis

您可以像注入其他 Spring Bean 一樣,注入自動配置的 RedisConnectionFactoryStringRedisTemplate 或原生的 RedisTemplate 例項。以下列表顯示了此類 bean 的示例

  • Java

  • Kotlin

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final StringRedisTemplate template;

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

	// ...

	public Boolean someMethod() {
		return this.template.hasKey("spring");
	}

}
import org.springframework.data.redis.core.StringRedisTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val template: StringRedisTemplate) {

	// ...

	fun someMethod(): Boolean {
		return template.hasKey("spring")
	}

}

預設情況下,例項會嘗試連線到 localhost:6379 的 Redis 伺服器。您可以使用 spring.data.redis.* 屬性指定自定義連線詳情,如下例所示

  • Properties

  • YAML

spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.database=0
spring.data.redis.username=user
spring.data.redis.password=secret
spring:
  data:
    redis:
      host: "localhost"
      port: 6379
      database: 0
      username: "user"
      password: "secret"

您也可以直接指定 Redis 伺服器的 url。設定 url 時,將忽略 host、port、username 和 password 屬性。如下例所示

  • Properties

  • YAML

spring.data.redis.url=redis://user:secret@localhost:6379
spring.data.redis.database=0
spring:
  data:
    redis:
      url: "redis://user:secret@localhost:6379"
      database: 0
您還可以註冊任意數量實現 LettuceClientConfigurationBuilderCustomizer 的 bean,用於更高階的自定義。ClientResources 也可以透過 ClientResourcesBuilderCustomizer 進行自定義。如果您使用 Jedis,JedisClientConfigurationBuilderCustomizer 也可用。另外,您可以註冊一個 RedisStandaloneConfigurationRedisSentinelConfigurationRedisClusterConfiguration 型別的 bean,以便完全控制配置。

如果您添加了自己的任意自動配置型別的 @Bean,它將替換預設配置(RedisTemplate 除外,在這種情況下,排除是基於 bean 名稱 redisTemplate,而不是其型別)。

預設情況下,如果 commons-pool2 在 classpath 中,將自動配置一個連線池工廠。

自動配置的 RedisConnectionFactory 可以配置為使用 SSL 與伺服器通訊,透過設定屬性即可,如下例所示

  • Properties

  • YAML

spring.data.redis.ssl.enabled=true
spring:
  data:
    redis:
      ssl:
        enabled: true

可以在 SSL bundle 中配置自定義 SSL 信任材料,並將其應用於 RedisConnectionFactory,如下例所示

  • Properties

  • YAML

spring.data.redis.ssl.bundle=example
spring:
  data:
    redis:
      ssl:
        bundle: "example"

MongoDB

MongoDB 是一個開源的 NoSQL 文件資料庫,它使用類似 JSON 的模式,而不是傳統的基於表的關聯資料。Spring Boot 為使用 MongoDB 提供了多種便利,包括 spring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive starter。

連線到 MongoDB 資料庫

要訪問 MongoDB 資料庫,您可以注入一個自動配置的 MongoDatabaseFactory。預設情況下,例項會嘗試連線到 mongodb:///test 的 MongoDB 伺服器。以下示例展示瞭如何連線到 MongoDB 資料庫

  • Java

  • Kotlin

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final MongoDatabaseFactory mongo;

	public MyBean(MongoDatabaseFactory mongo) {
		this.mongo = mongo;
	}

	// ...

	public MongoCollection<Document> someMethod() {
		MongoDatabase db = this.mongo.getMongoDatabase();
		return db.getCollection("users");
	}

}
import com.mongodb.client.MongoCollection
import org.bson.Document
import org.springframework.data.mongodb.MongoDatabaseFactory
import org.springframework.stereotype.Component

@Component
class MyBean(private val mongo: MongoDatabaseFactory) {

	// ...

	fun someMethod(): MongoCollection<Document> {
		val db = mongo.mongoDatabase
		return db.getCollection("users")
	}

}

如果您已定義了自己的 MongoClient,它將被用來自動配置一個合適的 MongoDatabaseFactory

自動配置的 MongoClient 是使用 MongoClientSettings bean 建立的。如果您已定義了自己的 MongoClientSettings,它將不做修改地被使用,並且 spring.data.mongodb 屬性將被忽略。否則,將自動配置一個 MongoClientSettings 並應用 spring.data.mongodb 屬性。無論哪種情況,您都可以宣告一個或多個 MongoClientSettingsBuilderCustomizer bean 來微調 MongoClientSettings 配置。每個 bean 都將按順序呼叫用於構建 MongoClientSettingsMongoClientSettings.Builder

您可以設定 spring.data.mongodb.uri 屬性來更改 URL 並配置附加設定,例如 *副本集 (replica set)*,如下例所示

  • Properties

  • YAML

spring.data.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring:
  data:
    mongodb:
      uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"

另外,您可以使用獨立的屬性指定連線詳情。例如,您可以在 application.properties 中宣告以下設定

  • Properties

  • YAML

spring.data.mongodb.host=mongoserver1.example.com
spring.data.mongodb.port=27017
spring.data.mongodb.additional-hosts[0]=mongoserver2.example.com:23456
spring.data.mongodb.database=test
spring.data.mongodb.username=user
spring.data.mongodb.password=secret
spring:
  data:
    mongodb:
      host: "mongoserver1.example.com"
      port: 27017
      additional-hosts:
      - "mongoserver2.example.com:23456"
      database: "test"
      username: "user"
      password: "secret"

自動配置的 MongoClient 可以配置為使用 SSL 與伺服器通訊,透過設定屬性即可,如下例所示

  • Properties

  • YAML

spring.data.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring.data.mongodb.ssl.enabled=true
spring:
  data:
    mongodb:
      uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"
      ssl:
        enabled: true

可以在 SSL bundle 中配置自定義 SSL 信任材料,並將其應用於 MongoClient,如下例所示

  • Properties

  • YAML

spring.data.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring.data.mongodb.ssl.bundle=example
spring:
  data:
    mongodb:
      uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"
      ssl:
        bundle: "example"

如果未指定 spring.data.mongodb.port,則使用預設值 27017。您可以從前面顯示的示例中刪除此行。

您也可以使用 host:port 語法將埠指定為主機地址的一部分。如果您需要更改 additional-hosts 條目的埠,應使用此格式。

如果您不使用 Spring Data MongoDB,可以注入 MongoClient bean,而不是使用 MongoDatabaseFactory。如果您希望完全控制 MongoDB 連線的建立,也可以宣告自己的 MongoDatabaseFactoryMongoClient bean。
如果您使用響應式驅動程式,則 SSL 需要 Netty。如果 Netty 可用且待使用的工廠尚未自定義,自動配置會自動配置此工廠。

MongoTemplate

Spring Data MongoDB 提供了一個 MongoTemplate 類,其設計與 Spring 的 JdbcTemplate 非常相似。與 JdbcTemplate 一樣,Spring Boot 為您自動配置了一個 bean 以便注入模板,如下所示

  • Java

  • Kotlin

import com.mongodb.client.MongoCollection;
import org.bson.Document;

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final MongoTemplate mongoTemplate;

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

	// ...

	public MongoCollection<Document> someMethod() {
		return this.mongoTemplate.getCollection("users");
	}

}
import com.mongodb.client.MongoCollection
import org.bson.Document
import org.springframework.data.mongodb.core.MongoTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val mongoTemplate: MongoTemplate) {

	// ...

	fun someMethod(): MongoCollection<Document> {
		return mongoTemplate.getCollection("users")
	}

}

有關完整詳情,請參閱 MongoOperations API 文件。

Spring Data MongoDB 倉庫

Spring Data 包含對 MongoDB 的倉庫支援。與之前討論的 JPA 倉庫一樣,基本原理是根據方法名稱自動構建查詢。

事實上,Spring Data JPA 和 Spring Data MongoDB 共享相同的通用基礎設施。您可以採用之前的 JPA 示例,並假設 City 現在是一個 MongoDB 資料類而不是 JPA @Entity,它會以相同的方式工作,如下例所示

  • Java

  • Kotlin

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.Repository;

public interface CityRepository extends Repository<City, Long> {

	Page<City> findAll(Pageable pageable);

	City findByNameAndStateAllIgnoringCase(String name, String state);

}
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.data.repository.Repository

interface CityRepository :
	Repository<City?, Long?> {
	fun findAll(pageable: Pageable?): Page<City?>?
	fun findByNameAndStateAllIgnoringCase(name: String?, state: String?): City?
}

透過掃描查詢倉庫和文件。預設情況下,會自動掃描自動配置包。您可以使用 @EnableMongoRepositories@EntityScan 分別自定義查詢倉庫和文件的位置。

有關 Spring Data MongoDB 的完整詳情,包括其豐富的物件對映技術,請參閱其參考文件

Neo4j

Neo4j 是一個開源的 NoSQL 圖資料庫,它使用由一流關係連線的節點的豐富資料模型,這比傳統的 RDBMS 方法更適合處理連線的“大資料”。Spring Boot 為使用 Neo4j 提供了多種便利,包括 spring-boot-starter-data-neo4j starter。

連線到 Neo4j 資料庫

要訪問 Neo4j 伺服器,您可以注入一個自動配置的 Driver。預設情況下,例項會嘗試使用 Bolt 協議連線到 localhost:7687 的 Neo4j 伺服器。以下示例展示瞭如何注入 Neo4j Driver,它允許您訪問 Session 等內容

  • Java

  • Kotlin

import org.neo4j.driver.Driver;
import org.neo4j.driver.Session;
import org.neo4j.driver.Values;

import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final Driver driver;

	public MyBean(Driver driver) {
		this.driver = driver;
	}

	// ...

	public String someMethod(String message) {
		try (Session session = this.driver.session()) {
			return session.executeWrite(
					(transaction) -> transaction
						.run("CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)",
								Values.parameters("message", message))
						.single()
						.get(0)
						.asString());
		}
	}

}
import org.neo4j.driver.*
import org.springframework.stereotype.Component

@Component
class MyBean(private val driver: Driver) {
	// ...
	fun someMethod(message: String?): String {
		driver.session().use { session ->
			return@someMethod session.executeWrite { transaction: TransactionContext ->
				transaction
					.run(
						"CREATE (a:Greeting) SET a.message = \$message RETURN a.message + ', from node ' + id(a)",
						Values.parameters("message", message)
					)
					.single()[0].asString()
			}
		}
	}
}

您可以使用 spring.neo4j.* 屬性配置 driver 的各個方面。以下示例展示瞭如何配置要使用的 uri 和憑據

  • Properties

  • YAML

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

自動配置的 Driver 是使用 org.neo4j.driver.Config$ConfigBuilder 建立的。為了微調其配置,請宣告一個或多個 ConfigBuilderCustomizer bean。每個 bean 都將按順序呼叫用於構建 Driverorg.neo4j.driver.Config$ConfigBuilder

Spring Data Neo4j 倉庫

Spring Data 包含對 Neo4j 的倉庫支援。有關 Spring Data Neo4j 的完整詳情,請參閱參考文件

Spring Data Neo4j 與許多其他 Spring Data 模組一樣,共享 Spring Data JPA 的通用基礎設施。您可以採用之前的 JPA 示例,並定義 City 為 Spring Data Neo4j @Node 而不是 JPA @Entity,倉庫抽象會以相同的方式工作,如下例所示

  • Java

  • Kotlin

import java.util.Optional;

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

public interface CityRepository extends Neo4jRepository<City, Long> {

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

}
import org.springframework.data.neo4j.repository.Neo4jRepository
import java.util.Optional

interface CityRepository : Neo4jRepository<City?, Long?> {

	fun findOneByNameAndState(name: String?, state: String?): Optional<City?>?

}

spring-boot-starter-data-neo4j starter 啟用了倉庫支援以及事務管理。Spring Boot 使用 Neo4jTemplateReactiveNeo4jTemplate bean 支援經典和響應式 Neo4j 倉庫。當 classpath 中存在 Project Reactor 時,也會自動配置響應式風格。

透過掃描查詢倉庫和實體。預設情況下,會自動掃描自動配置包。您可以使用 @EnableNeo4jRepositories@EntityScan 分別自定義查詢倉庫和實體的位置。

在使用響應式風格的應用中,ReactiveTransactionManager 不會被自動配置。要啟用事務管理,必須在您的配置中定義以下 bean

  • Java

  • Kotlin

import org.neo4j.driver.Driver;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider;
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;

@Configuration(proxyBeanMethods = false)
public class MyNeo4jConfiguration {

	@Bean
	public ReactiveNeo4jTransactionManager reactiveTransactionManager(Driver driver,
			ReactiveDatabaseSelectionProvider databaseNameProvider) {
		return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider);
	}

}
import org.neo4j.driver.Driver
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager

@Configuration(proxyBeanMethods = false)
class MyNeo4jConfiguration {

	@Bean
	fun reactiveTransactionManager(driver: Driver,
			databaseNameProvider: ReactiveDatabaseSelectionProvider): ReactiveNeo4jTransactionManager {
		return ReactiveNeo4jTransactionManager(driver, databaseNameProvider)
	}
}

Elasticsearch

Elasticsearch 是一個開源、分散式、RESTful 的搜尋和分析引擎。Spring Boot 為 Elasticsearch 客戶端提供了基本自動配置。

Spring Boot 支援多種客戶端

Spring Boot 提供了一個專用的 starter,即 spring-boot-starter-data-elasticsearch

使用 REST 客戶端連線到 Elasticsearch

Elasticsearch 提供了兩種不同的 REST 客戶端,可用於查詢叢集:來自 org.elasticsearch.client:elasticsearch-rest-client 模組的低階客戶端,以及來自 co.elastic.clients:elasticsearch-java 模組的Java API 客戶端。此外,Spring Boot 支援來自 org.springframework.data:spring-data-elasticsearch 模組的響應式客戶端。預設情況下,客戶端將連線到 localhost:9200。您可以使用 spring.elasticsearch.* 屬性進一步調整客戶端的配置方式,如下例所示

  • Properties

  • YAML

spring.elasticsearch.uris=https://search.example.com:9200
spring.elasticsearch.socket-timeout=10s
spring.elasticsearch.username=user
spring.elasticsearch.password=secret
spring:
  elasticsearch:
    uris: "https://search.example.com:9200"
    socket-timeout: "10s"
    username: "user"
    password: "secret"

使用 RestClient 連線到 Elasticsearch

如果 elasticsearch-rest-client 在 classpath 中,Spring Boot 將自動配置並註冊一個 RestClient bean。除了前面描述的屬性外,要微調 RestClient,您可以註冊任意數量實現 RestClientBuilderCustomizer 的 bean,用於更高階的自定義。要完全控制客戶端的配置,請定義一個 RestClientBuilder bean。

此外,如果 elasticsearch-rest-client-sniffer 在 classpath 中,將自動配置一個 Sniffer,用於自動發現正在執行的 Elasticsearch 叢集中的節點,並將其設定到 RestClient bean 上。您可以進一步調整 Sniffer 的配置方式,如下例所示

  • Properties

  • YAML

spring.elasticsearch.restclient.sniffer.interval=10m
spring.elasticsearch.restclient.sniffer.delay-after-failure=30s
spring:
  elasticsearch:
    restclient:
      sniffer:
        interval: "10m"
        delay-after-failure: "30s"

使用 ElasticsearchClient 連線到 Elasticsearch

如果 co.elastic.clients:elasticsearch-java 在 classpath 中,Spring Boot 將自動配置並註冊一個 ElasticsearchClient bean。

ElasticsearchClient 使用一個傳輸層,該傳輸層依賴於前面描述的 RestClient。因此,前面描述的屬性可以用來配置 ElasticsearchClient。此外,你可以定義一個 RestClientOptions bean,以進一步控制傳輸層的行為。

使用 ReactiveElasticsearchClient 連線到 Elasticsearch

Spring Data Elasticsearch 提供了 ReactiveElasticsearchClient,用於以響應式方式查詢 Elasticsearch 例項。如果你的 classpath 中有 Spring Data Elasticsearch 和 Reactor,Spring Boot 將自動配置並註冊一個 ReactiveElasticsearchClient

ReactiveElasticsearchClient 使用一個傳輸層,該傳輸層依賴於前面描述的 RestClient。因此,前面描述的屬性可以用來配置 ReactiveElasticsearchClient。此外,你可以定義一個 RestClientOptions bean,以進一步控制傳輸層的行為。

使用 Spring Data 連線到 Elasticsearch

要連線到 Elasticsearch,必須定義一個 ElasticsearchClient bean,它可以由 Spring Boot 自動配置,或由應用程式手動提供(參見前面章節)。有了這個配置後,就可以像注入其他 Spring bean 一樣注入 ElasticsearchTemplate,如下例所示:

  • Java

  • Kotlin

import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final ElasticsearchTemplate template;

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

	// ...

	public boolean someMethod(String id) {
		return this.template.exists(id, User.class);
	}

}
import org.springframework.stereotype.Component

@Component
class MyBean(private val template: org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate ) {

	// ...

	fun someMethod(id: String): Boolean {
		return template.exists(id, User::class.java)
	}

}

如果存在 spring-data-elasticsearch 和 Reactor,Spring Boot 還可以自動配置 ReactiveElasticsearchClientReactiveElasticsearchTemplate 作為 bean。它們與其他 REST 客戶端是響應式的對應。

Spring Data Elasticsearch 倉庫

Spring Data 包含了對 Elasticsearch 的倉庫支援。與前面討論的 JPA 倉庫一樣,基本原則是根據方法名稱自動為你構建查詢。

事實上,Spring Data JPA 和 Spring Data Elasticsearch 共享相同的通用基礎設施。你可以參照之前的 JPA 示例,並假設 City 現在是一個 Elasticsearch @Document 類而不是 JPA @Entity,它的工作方式是相同的。

倉庫和文件透過掃描查詢。預設情況下,自動配置包會被掃描。你可以使用 @EnableElasticsearchRepositories@EntityScan 分別自定義查詢倉庫和文件的位置。

有關 Spring Data Elasticsearch 的完整詳情,請參閱其參考文件

Spring Boot 支援經典和響應式 Elasticsearch 倉庫,使用 ElasticsearchTemplateReactiveElasticsearchTemplate bean。如果存在所需的依賴項,這些 bean 很可能由 Spring Boot 自動配置。

如果你希望使用自己的模板來支援 Elasticsearch 倉庫,可以新增自己的 ElasticsearchTemplateElasticsearchOperations @Bean,只要其名稱為 "elasticsearchTemplate"。同樣適用於 ReactiveElasticsearchTemplateReactiveElasticsearchOperations,其 bean 名稱為 "reactiveElasticsearchTemplate"

你可以使用以下屬性停用倉庫支援:

  • Properties

  • YAML

spring.data.elasticsearch.repositories.enabled=false
spring:
  data:
    elasticsearch:
      repositories:
        enabled: false

Cassandra

Cassandra 是一個開源的分散式資料庫管理系統,旨在處理跨眾多普通伺服器的大量資料。Spring Boot 為 Cassandra 及其上由 Spring Data Cassandra 提供的抽象提供了自動配置。有一個 spring-boot-starter-data-cassandra 啟動器,用於方便地收集依賴項。

連線到 Cassandra

你可以像注入任何其他 Spring Bean 一樣注入一個自動配置的 CassandraTemplate 或 Cassandra CqlSession 例項。spring.cassandra.* 屬性可用於自定義連線。通常,你需要提供 keyspace-namecontact-points 以及本地資料中心名稱,如下例所示:

  • Properties

  • YAML

spring.cassandra.keyspace-name=mykeyspace
spring.cassandra.contact-points=cassandrahost1:9042,cassandrahost2:9042
spring.cassandra.local-datacenter=datacenter1
spring:
  cassandra:
    keyspace-name: "mykeyspace"
    contact-points: "cassandrahost1:9042,cassandrahost2:9042"
    local-datacenter: "datacenter1"

如果所有 contact points 的埠相同,可以使用快捷方式,只指定主機名,如下例所示:

  • Properties

  • YAML

spring.cassandra.keyspace-name=mykeyspace
spring.cassandra.contact-points=cassandrahost1,cassandrahost2
spring.cassandra.local-datacenter=datacenter1
spring:
  cassandra:
    keyspace-name: "mykeyspace"
    contact-points: "cassandrahost1,cassandrahost2"
    local-datacenter: "datacenter1"
這兩個示例是等價的,因為埠預設為 9042。如果需要配置埠,請使用 spring.cassandra.port

自動配置的 CqlSession 可以透過設定如下例所示的屬性來配置使用 SSL 與伺服器通訊:

  • Properties

  • YAML

spring.cassandra.keyspace-name=mykeyspace
spring.cassandra.contact-points=cassandrahost1,cassandrahost2
spring.cassandra.local-datacenter=datacenter1
spring.cassandra.ssl.enabled=true
spring:
  cassandra:
    keyspace-name: "mykeyspace"
    contact-points: "cassandrahost1,cassandrahost2"
    local-datacenter: "datacenter1"
    ssl:
      enabled: true

可以在SSL 捆綁包中配置自定義 SSL 信任材料,並將其應用於 CqlSession,如下例所示:

  • Properties

  • YAML

spring.cassandra.keyspace-name=mykeyspace
spring.cassandra.contact-points=cassandrahost1,cassandrahost2
spring.cassandra.local-datacenter=datacenter1
spring.cassandra.ssl.bundle=example
spring:
  cassandra:
    keyspace-name: "mykeyspace"
    contact-points: "cassandrahost1,cassandrahost2"
    local-datacenter: "datacenter1"
    ssl:
      bundle: "example"

Cassandra 驅動程式有自己的配置基礎設施,它會在 classpath 的根目錄載入一個 application.conf

Spring Boot 預設不查詢此類檔案,但可以使用 spring.cassandra.config 載入。如果一個屬性同時存在於 spring.cassandra.* 和配置檔案中,spring.cassandra.* 中的值將優先。

對於更高階的驅動程式自定義,可以註冊任意數量的實現 DriverConfigLoaderBuilderCustomizer 的 bean。可以使用型別為 CqlSessionBuilderCustomizer 的 bean 來自定義 CqlSession

如果使用 CqlSessionBuilder 建立多個 CqlSession bean,請記住構建器是可變的,因此請確保為每個會話注入一個新的副本。

以下程式碼清單展示瞭如何注入 Cassandra bean:

  • Java

  • Kotlin

import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final CassandraTemplate template;

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

	// ...

	public long someMethod() {
		return this.template.count(User.class);
	}

}
import org.springframework.data.cassandra.core.CassandraTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val template: CassandraTemplate) {

	// ...

	fun someMethod(): Long {
		return template.count(User::class.java)
	}

}

如果你新增自己的型別為 CassandraTemplate@Bean,它將替換預設的 bean。

Spring Data Cassandra 倉庫

Spring Data 包含了對 Cassandra 的基本倉庫支援。目前,這比前面討論的 JPA 倉庫受限,並且需要使用 @Query 註解的查詢方法。

倉庫和實體透過掃描查詢。預設情況下,自動配置包會被掃描。你可以使用 @EnableCassandraRepositories@EntityScan 分別自定義查詢倉庫和實體的位置。

有關 Spring Data Cassandra 的完整詳情,請參閱其參考文件

Couchbase

Couchbase 是一個開源的分散式多模型 NoSQL 文件導向資料庫,針對互動式應用程式進行了最佳化。Spring Boot 為 Couchbase 及其上由 Spring Data Couchbase 提供的抽象提供了自動配置。有 spring-boot-starter-data-couchbasespring-boot-starter-data-couchbase-reactive 啟動器,用於方便地收集依賴項。

連線到 Couchbase

透過新增 Couchbase SDK 和一些配置,你可以獲得一個 Clusterspring.couchbase.* 屬性可以用來定製連線。通常,你需要提供連線字串和用於身份驗證的憑證。可以使用使用者名稱和密碼進行基本身份驗證,如下例所示:

  • Properties

  • YAML

spring.couchbase.connection-string=couchbase://192.168.1.123
spring.couchbase.username=user
spring.couchbase.password=secret
spring:
  couchbase:
    connection-string: "couchbase://192.168.1.123"
    username: "user"
    password: "secret"

可以使用客戶端證書進行身份驗證,而不是使用使用者名稱和密碼。包含客戶端證書的 Java KeyStore 的位置和密碼可以配置,如下例所示:

  • Properties

  • YAML

spring.couchbase.connection-string=couchbase://192.168.1.123
spring.couchbase.env.ssl.enabled=true
spring.couchbase.authentication.jks.location=classpath:client.p12
spring.couchbase.authentication.jks.password=secret
spring:
  couchbase:
    connection-string: "couchbase://192.168.1.123"
    env:
      ssl:
        enabled: true
    authentication:
      jks:
        location: "classpath:client.p12"
        password: "secret"

PEM 編碼的證書和私鑰可以配置,如下例所示:

  • Properties

  • YAML

spring.couchbase.connection-string=couchbase://192.168.1.123
spring.couchbase.env.ssl.enabled=true
spring.couchbase.authentication.pem.certificates=classpath:client.crt
spring.couchbase.authentication.pem.private-key=classpath:client.key
spring:
  couchbase:
    connection-string: "couchbase://192.168.1.123"
    env:
      ssl:
        enabled: true
    authentication:
      pem:
        certificates: "classpath:client.crt"
        private-key: "classpath:client.key"

也可以自定義一些 ClusterEnvironment 設定。例如,以下配置更改了開啟新 Bucket 的超時時間,並使用對已配置SSL 捆綁包的引用啟用 SSL 支援:

  • Properties

  • YAML

spring.couchbase.env.timeouts.connect=3s
spring.couchbase.env.ssl.bundle=example
spring:
  couchbase:
    env:
      timeouts:
        connect: "3s"
      ssl:
        bundle: "example"
有關更多詳細資訊,請檢視 spring.couchbase.env.* 屬性。要進行更多控制,可以使用一個或多個 ClusterEnvironmentBuilderCustomizer bean。

Spring Data Couchbase 倉庫

Spring Data 包含了對 Couchbase 的倉庫支援。

倉庫和文件透過掃描查詢。預設情況下,自動配置包會被掃描。你可以使用 @EnableCouchbaseRepositories@EntityScan 分別自定義查詢倉庫和文件的位置。

有關 Spring Data Couchbase 的完整詳情,請參閱其參考文件

如果 CouchbaseClientFactory bean 可用,你可以像注入任何其他 Spring Bean 一樣注入自動配置的 CouchbaseTemplate 例項。當 Cluster 可用(如上所述)且已指定 bucket 名稱時,就會發生這種情況:

  • Properties

  • YAML

spring.data.couchbase.bucket-name=my-bucket
spring:
  data:
    couchbase:
      bucket-name: "my-bucket"

以下示例展示瞭如何注入 CouchbaseTemplate bean:

  • Java

  • Kotlin

import org.springframework.data.couchbase.core.CouchbaseTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final CouchbaseTemplate template;

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

	// ...

	public String someMethod() {
		return this.template.getBucketName();
	}

}
import org.springframework.data.couchbase.core.CouchbaseTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val template: CouchbaseTemplate) {

	// ...

	fun someMethod(): String {
		return template.bucketName
	}

}

你可以定義一些 bean 來覆蓋自動配置提供的 bean:

為了避免在自己的配置中硬編碼這些名稱,可以重用 Spring Data Couchbase 提供的 BeanNames。例如,可以自定義要使用的轉換器,如下所示:

  • Java

  • Kotlin

import org.assertj.core.util.Arrays;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.couchbase.config.BeanNames;
import org.springframework.data.couchbase.core.convert.CouchbaseCustomConversions;

@Configuration(proxyBeanMethods = false)
public class MyCouchbaseConfiguration {

	@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
	public CouchbaseCustomConversions myCustomConversions() {
		return new CouchbaseCustomConversions(Arrays.asList(new MyConverter()));
	}

}
import org.assertj.core.util.Arrays
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.couchbase.config.BeanNames
import org.springframework.data.couchbase.core.convert.CouchbaseCustomConversions

@Configuration(proxyBeanMethods = false)
class MyCouchbaseConfiguration {

	@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
	fun myCustomConversions(): CouchbaseCustomConversions {
		return CouchbaseCustomConversions(Arrays.asList(MyConverter()))
	}

}

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,如下例所示:

  • Properties

  • YAML

spring.ldap.urls=ldap://myserver:1235
spring.ldap.username=admin
spring.ldap.password=secret
spring:
  ldap:
    urls: "ldap://myserver:1235"
    username: "admin"
    password: "secret"

如果需要自定義連線設定,可以使用 spring.ldap.basespring.ldap.base-environment 屬性。

基於這些設定,LdapContextSource 將被自動配置。如果存在 DirContextAuthenticationStrategy bean,它將與自動配置的 LdapContextSource 關聯。如果需要自定義它,例如使用 PooledContextSource,你仍然可以注入自動配置的 LdapContextSource。確保將你的自定義 ContextSource 標記為 @Primary,以便自動配置的 LdapTemplate 使用它。

Spring Data LDAP 倉庫

Spring Data 包含了對 LDAP 的倉庫支援。

倉庫和文件透過掃描查詢。預設情況下,自動配置包會被掃描。你可以使用 @EnableLdapRepositories@EntityScan 分別自定義查詢倉庫和文件的位置。

有關 Spring Data LDAP 的完整詳情,請參閱其參考文件

你也可以像注入任何其他 Spring Bean 一樣注入自動配置的 LdapTemplate 例項,如下例所示:

  • Java

  • Kotlin

import java.util.List;

import org.springframework.ldap.core.LdapTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

	private final LdapTemplate template;

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

	// ...

	public List<User> someMethod() {
		return this.template.findAll(User.class);
	}

}
import org.springframework.ldap.core.LdapTemplate
import org.springframework.stereotype.Component

@Component
class MyBean(private val template: LdapTemplate) {

	// ...

	fun someMethod(): List<User> {
		return template.findAll(User::class.java)
	}

}

嵌入式記憶體 LDAP 伺服器

出於測試目的,Spring Boot 支援對 UnboundID 提供的記憶體 LDAP 伺服器進行自動配置。要配置伺服器,請新增對 com.unboundid:unboundid-ldapsdk 的依賴,並宣告一個 spring.ldap.embedded.base-dn 屬性,如下所示:

  • Properties

  • YAML

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

可以定義多個 base-dn 值,但是,由於專有名稱通常包含逗號,必須使用正確的符號進行定義。

在 yaml 檔案中,可以使用 yaml 列表符號。在 properties 檔案中,必須將索引包含在屬性名稱中:

  • Properties

  • YAML

spring.ldap.embedded.base-dn[0]=dc=spring,dc=io
spring.ldap.embedded.base-dn[1]=dc=vmware,dc=com
spring.ldap.embedded.base-dn:
- "dc=spring,dc=io"
- "dc=vmware,dc=com"

預設情況下,伺服器在隨機埠上啟動,並觸發常規的 LDAP 支援。無需指定 spring.ldap.urls 屬性。

如果 classpath 中存在 schema.ldif 檔案,它將用於初始化伺服器。如果想從不同的資源載入初始化指令碼,也可以使用 spring.ldap.embedded.ldif 屬性。

預設情況下,使用標準模式驗證 LDIF 檔案。可以透過設定 spring.ldap.embedded.validation.enabled 屬性來完全關閉驗證。如果具有自定義屬性,可以使用 spring.ldap.embedded.validation.schema 定義自定義屬性型別或物件類。