|
此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
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 客户端提供了自动配置,但该功能已被弃用,推荐使用新的 InfluxDB Java 客户端,它自带 Spring Boot 集成。
Redis
Redis 是一个缓存、消息代理以及功能丰富的键值存储。 Spring Boot 为 Lettuce 和 Jedis 客户端库及其顶层提供的抽象提供了基本的自动配置,并且支持 Spring Data Redis。
有一个 spring-boot-starter-data-redis 起步依赖,用于以便捷的方式收集所需依赖。
默认情况下,它使用 Lettuce。
该起步依赖同时支持传统应用和响应式应用。
我们还提供了一个spring-boot-starter-data-redis-reactiveStarters,以与其他支持响应式功能的存储系统保持一致。 |
连接至 Redis
您可以像注入任何其他 Spring Bean 一样,注入一个自动配置的 RedisConnectionFactory、StringRedisTemplate 或原生的 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。 |
或者,您可以注册类型为 RedisStandaloneConfiguration、RedisSentinelConfiguration、RedisClusterConfiguration 或 RedisStaticMasterReplicaConfiguration 的 Bean,以完全控制配置。
| Jedis 不支持主从(master/replica)模式。 |
如果您添加了自己的任何自动配置类型的 @Bean,它将替换默认实现(RedisTemplate 除外,此时排除是基于 Bean 名称 redisTemplate 而非其类型)。
默认情况下,如果类路径上存在commons-pool2,会自动配置一个连接池工厂。
自动配置的 RedisConnectionFactory 可以通过设置如下示例所示的属性,配置为使用 SSL 与服务器进行通信:
-
Properties
-
YAML
spring.data.redis.ssl.enabled=true
spring:
data:
redis:
ssl:
enabled: true
自定义 SSL 信任材料可以在 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-mongodb 和 spring-boot-starter-data-mongodb-reactive 起步依赖。
连接到 MongoDB 数据库
要访问 MongoDB 数据库,您可以注入一个自动配置的 MongoDatabaseFactory。
默认情况下,该实例会尝试连接到位于 mongodb://localhost/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 的配置。
每个回调器都将按顺序被调用,并传入用于构建 MongoClientSettings 的 MongoClientSettings.Builder。
你可以设置 spring.mongodb.uri 属性来更改 URL,并配置额外的设置,例如副本集,如下例所示:
-
Properties
-
YAML
spring.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring:
mongodb:
uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"
Alternatively, you可以指定连接细节使用离散属性。
例如,你可能在application.properties中声明以下设置:
-
Properties
-
YAML
spring.mongodb.host=mongoserver1.example.com
spring.mongodb.port=27017
spring.mongodb.additional-hosts[0]=mongoserver2.example.com:23456
spring.mongodb.database=test
spring.mongodb.username=user
spring.mongodb.password=secret
spring:
mongodb:
host: "mongoserver1.example.com"
port: 27017
additional-hosts:
- "mongoserver2.example.com:23456"
database: "test"
username: "user"
password: "secret"
自动配置的 MongoClient 可以通过设置如下示例所示的属性,配置为使用 SSL 与服务器进行通信:
-
Properties
-
YAML
spring.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring.mongodb.ssl.enabled=true
spring:
mongodb:
uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"
ssl:
enabled: true
自定义 SSL 信任材料可以在 SSL 捆绑包 中进行配置,并如本示例所示应用于 MongoClient:
-
Properties
-
YAML
spring.mongodb.uri=mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test
spring.mongodb.ssl.bundle=example
spring:
mongodb:
uri: "mongodb://user:[email protected]:27017,mongoserver2.example.com:23456/test"
ssl:
bundle: "example"
|
如果未指定 您还可以在主机地址中指定端口,使用 |
如果您不使用 Spring Data MongoDB,可以注入一个 MongoClient Bean,而不是使用 MongoDatabaseFactory。
如果您希望完全控制建立 MongoDB 连接的过程,也可以声明您自己的 MongoDatabaseFactory 或 MongoClient Bean。 |
| 如果您使用的是响应式驱动程序,Netty 是必需的用于 SSL。 自动配置会如果可用且未自定义要使用的工厂,则会自动配置此工厂。 |
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的完整细节,包括其丰富的对象映射技术,请参见其https://docs.spring.io/spring-data/mongodb/reference/5.1。 |
Neo4J
Neo4j 是一个开源的 NoSQL 图数据库,使用了丰富的数据模型来表示节点通过一等关系相连接,这使其在处理关联的大数据方面比传统的 RDBMS 方法更为合适。
Spring Boot 为与 Neo4j 的工作提供了几种便利措施,包括 spring-boot-starter-data-neo4j 起始器。
连接到 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.Driver
import org.neo4j.driver.TransactionContext
import org.neo4j.driver.Values
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.*属性来配置驱动的各种方面。以下示例显示了如何配置要使用的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 将按顺序被调用,并传入用于构建 Driver 的 org.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 Starters启用了仓库支持以及事务管理。
Spring Boot 支持经典式和响应式 Neo4j 仓库,使用 Neo4jTemplate 或 ReactiveNeo4jTemplate Bean。
当 Project Reactor 存在于类路径中时,响应式风格也会自动配置。
仓库和实体是通过扫描找到的。
默认情况下,会扫描 自动配置包。
您可以分别使用 @EnableNeo4jRepositories 和 @EntityScan 自定义查找仓库和实体的位置。
|
在采用响应式风格的应用程序中,不会自动配置
|
Elasticsearch
Elasticsearch 是一个开源的、分布式的、RESTful 搜索和分析引擎。 Spring Boot 提供了基本的 Elasticsearch 客户端自动配置。
Spring Boot 支持多种客户端:
-
官方低级REST客户端
-
Java官方API客户端
-
Spring Data Elasticsearch 提供的
ReactiveElasticsearchClient
Spring Boot 提供了一个专用的Starters,spring-boot-starter-data-elasticsearch。
使用 REST 客户端连接 Elasticsearch
Elasticsearch 提供了两种不同的 REST 客户端,可用于查询集群:低级别客户端和Java API 客户端。
Java API 客户端由 co.elastic.clients:elasticsearch-java 模块提供,
而低级别客户端则由 co.elastic.clients:elasticsearch-rest5-client 模块提供。
此外,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"
使用 Rest5Client 连接 Elasticsearch
如果您的类路径上有 co.elastic.clients:elasticsearch-rest5-client,Spring Boot 将自动配置并注册一个 Rest5Client Bean。
除了前面描述的属性外,为了微调 Rest5Client,您可以注册任意数量的实现了 Rest5ClientBuilderCustomizer 的 Bean,以进行更高级的自定义。
若要完全控制客户端的配置,请定义一个 Rest5ClientBuilder Bean。
此外,Sniffer 可以自动配置,以自动发现正在运行的 Elasticsearch 集群中的节点,并将它们设置在 Rest5Client Bean 上。
您可以进一步调整 Sniffer 的配置方式,如下例所示:
-
Properties
-
YAML
spring.elasticsearch.restclient.sniffer.enabled=true
spring.elasticsearch.restclient.sniffer.interval=10m
spring.elasticsearch.restclient.sniffer.delay-after-failure=30s
spring:
elasticsearch:
restclient:
sniffer:
enabled: true
interval: "10m"
delay-after-failure: "30s"
使用 ElasticsearchClient 连接 Elasticsearch
如果您使用了 spring-boot-starter-elasticsearch 或将 co.elastic.clients:elasticsearch-java 添加到了类路径中,Spring Boot 将自动配置并注册一个 ElasticsearchClient Bean。
ElasticsearchClient 使用一种依赖于前述 Rest5Client 的传输机制。
因此,可以使用前述属性来配置 ElasticsearchClient。
此外,您可以定义一个 Rest5ClientOptions Bean,以进一步控制传输机制的行为。
使用 ReactiveElasticsearchClient 连接到 Elasticsearch
Spring Data Elasticsearch 提供了 ReactiveElasticsearchClient,用于以响应式方式查询 Elasticsearch 实例。
如果您的类路径中包含 Spring Data Elasticsearch 和 Reactor,Spring Boot 将自动配置并注册一个 ReactiveElasticsearchClient。
ReactiveElasticsearchClient 使用一种依赖于前述 Rest5Client 的传输机制。
因此,可以使用前述属性来配置 ReactiveElasticsearchClient。
此外,您可以定义一个 Rest5ClientOptions Bean,以进一步控制传输机制的行为。
使用 Spring Data 连接 Elasticsearch
要连接到 Elasticsearch,必须定义一个 ElasticsearchClient Bean,
该 Bean 可由 Spring Boot 自动配置,也可由应用程序手动提供(参见前面的章节)。
在此配置就位后,
ElasticsearchTemplate 可以像其他任何 Spring Bean 一样被注入,
如下例所示:
-
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 还可以自动配置一个 ReactiveElasticsearchClient 和一个 ReactiveElasticsearchTemplate 作为 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 仓库,使用 ElasticsearchTemplate 或 ReactiveElasticsearchTemplate Bean。
只要存在所需的依赖项,这些 Bean 很可能由 Spring Boot 自动配置。
如果您希望使用自己的模板来支持 Elasticsearch 仓库,您可以添加自己的 ElasticsearchTemplate 或 ElasticsearchOperations @Bean,只要其名称为 "elasticsearchTemplate"。
同样的规则也适用于 ReactiveElasticsearchTemplate 和 ReactiveElasticsearchOperations,其 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 一样,注入自动配置的 CqlTemplate、CassandraTemplate 或 Cassandra CqlSession 实例。
spring.cassandra.* 属性可用于自定义连接。
通常,您需要提供 keyspace-name 和 contact-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"
如果所有联系点使用相同的端口,您可以使用快捷方式只指定主机名,如下例所示:
-
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。 |
The auto-configured 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 bundle中配置自定义的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 驱动程序具有自己的配置基础设施,在类路径的根目录加载一个 Spring Boot 本身不会查找这样的文件,但可以通过 对于更高级的驱动程序自定义,您可以注册任意数量的实现 |
如果使用CqlSessionBuilder创建多个CqlSession bean,请注意builder是可变的,因此为每个会话注入新鲜副本。 |
该代码示例展示了如何注入一个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,它将替换默认值。
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-couchbase 和 spring-boot-starter-data-couchbase-reactive 两个 starter。
连接到 Couchbase
您可以通过添加 Couchbase SDK 和一些配置来获取 Cluster。
spring.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 Bean 一样注入一个自动配置的 CouchbaseTemplate 实例,前提是存在一个 CouchbaseClientFactory Bean。
当如上所述存在一个 Cluster 且已指定存储桶名称时,就会发生这种情况:
-
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:
-
一个
CouchbaseMappingContext@Bean,其名称为couchbaseMappingContext。 -
一个
CustomConversions@Bean,其名称为couchbaseCustomConversions。 -
一个
CouchbaseTemplate@Bean,其名称为couchbaseTemplate。
为了避免在您自己的配置中硬编码这些名称,您可以复用 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-ldapStarters或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.base和spring.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 文件中,您必须将索引作为属性名的一部分:
|
默认情况下,服务器将在一个随机端口启动并触发常规的LDAP支持。
无需指定spring.ldap.urls属性。
如果在类路径下有schema.ldif文件,它将用于初始化服务器。
如果您希望从不同的资源加载初始化脚本,还可以使用spring.ldap.embedded.ldif属性。
默认情况下,会使用标准模式验证LDIF文件。
您可以完全关闭验证,通过设置spring.ldap.embedded.validation.enabled属性。
如果您有自定义属性,则可以使用spring.ldap.embedded.validation.schema来定义您的自定义属性类型或对象类。
SSL
内存中的 LDAP 服务器支持 SSL(LDAPS)。
要启用 SSL,请通过设置 xref page 属性来配置要使用的 SSL 证书包,如下例所示:
-
Properties
-
YAML
spring.ldap.embedded.ssl.bundle=example
spring:
ldap:
embedded:
ssl:
bundle: "example"