跳到主要内容
版本:4.0.2

使用 NoSQL 技术

QWen Max 中英对照 Working with NoSQL Technologies

使用 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 为 LettuceJedis 客户端库,以及 Spring Data Redis 提供的上层抽象,提供了基本的自动配置。

有一个 spring-boot-starter-data-redis starter,用于以便捷的方式收集依赖项。默认情况下,它使用 Lettuce。该 starter 同时支持传统应用和响应式应用。

提示

为了与其他支持响应式(reactive)的存储保持一致,我们还提供了 spring-boot-starter-data-redis-reactive starter。

连接到 Redis

你可以像注入其他任何 Spring Bean 一样,注入一个自动配置的 RedisConnectionFactoryStringRedisTemplate 或普通的 RedisTemplate 实例。以下示例展示了这样一个 Bean:

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");
}

}

默认情况下,实例会尝试连接到 localhost:6379 的 Redis 服务器。你可以使用 spring.data.redis.* 属性来指定自定义的连接信息,如下例所示:

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

你也可以直接指定 Redis 服务器的 URL。设置 URL 后,hostportusernamepassword 属性将被忽略。如下例所示:

spring.data.redis.url=redis://user:secret@localhost:6379
spring.data.redis.database=0
提示

你还可以注册任意数量实现 LettuceClientConfigurationBuilderCustomizer 的 Bean,以进行更高级的自定义配置。ClientResources 也可以通过 ClientResourcesBuilderCustomizer 进行自定义。如果你使用 Jedis,还可以使用 JedisClientConfigurationBuilderCustomizer

或者,你可以注册一个类型为 RedisStandaloneConfigurationRedisSentinelConfigurationRedisClusterConfigurationRedisStaticMasterReplicaConfiguration 的 Bean,以完全控制配置。

备注

Jedis 不支持 master/replica。

如果你添加了任意自动配置类型自己的 @Bean,它将替换默认的 Bean(除了 RedisTemplate 的情况,此时排除是基于 Bean 名称 redisTemplate,而不是其类型)。

默认情况下,如果 commons-pool2 在 classpath 中,则会自动配置一个池化的连接工厂。

通过设置如下示例中的属性,可以将自动配置的 RedisConnectionFactory 配置为使用 SSL 与服务器通信:

spring.data.redis.ssl.enabled=true

可以通过 SSL bundle 配置自定义的 SSL 信任材料,并将其应用到 RedisConnectionFactory,如下例所示:

spring.data.redis.ssl.bundle=example

MongoDB

MongoDB 是一个开源的 NoSQL 文档数据库,它使用类 JSON 的 schema,而非传统的基于表的关系型数据结构。Spring Boot 为使用 MongoDB 提供了多项便利,包括 spring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive 起步依赖。

连接到 MongoDB 数据库

要访问 MongoDB 数据库,你可以注入一个自动配置的 MongoDatabaseFactory。默认情况下,该实例会尝试连接到位于 mongodb://localhost/test 的 MongoDB 服务器。以下示例展示了如何连接到 MongoDB 数据库:

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");
}

}

如果你已经定义了自己的 MongoClient,它将被用于自动配置一个合适的 MongoDatabaseFactory

自动配置的 MongoClient 是通过一个 MongoClientSettings Bean 创建的。如果你已经定义了自己的 MongoClientSettings,它将被直接使用而不做任何修改,此时 spring.data.mongodb 属性将被忽略。否则,会自动配置一个 MongoClientSettings,并将 spring.data.mongodb 属性应用到该配置中。无论哪种情况,你都可以声明一个或多个 MongoClientSettingsBuilderCustomizer Bean,以微调 MongoClientSettings 的配置。每个自定义器都会按顺序被调用,并传入用于构建 MongoClientSettingsMongoClientSettings.Builder

你可以设置 spring.mongodb.uri 属性来更改 URL,并配置额外的设置,例如 replica set,如下例所示:

spring.mongodb.uri=mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test

或者,你可以使用独立的属性来指定连接详情。例如,你可以在 application.properties 中声明以下设置:

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

通过设置如下示例中的属性,可以将自动配置的 MongoClient 配置为使用 SSL 与服务器通信:

spring.mongodb.uri=mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test
spring.mongodb.ssl.enabled=true

自定义 SSL 信任材料可以在 SSL bundle 中配置,并如以下示例所示应用于 MongoClient

spring.mongodb.uri=mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test
spring.mongodb.ssl.bundle=example
提示

如果未指定 spring.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,以便注入该模板,如下所示:

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");
}

}

有关完整详情,请参阅 MongoOperations API 文档。

Spring Data MongoDB Repositories

Spring Data 包含对 MongoDB 的 Repository 支持。与前面讨论的 JPA Repository 一样,其基本原理是根据方法名称自动构建查询。

事实上,Spring Data JPA 和 Spring Data MongoDB 共享相同的基础架构。你可以采用之前提到的 JPA 示例,假设 City 现在是一个 MongoDB 数据类,而不是 JPA 的 @Entity,它仍然以相同的方式工作,如下例所示:

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);

}

通过扫描可以找到 Repositories 和 documents。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableMongoRepositories@EntityScan 来自定义查找 repositories 和 documents 的位置。

提示

有关 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 等组件的访问权限:

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());
}
}

}

你可以使用 spring.neo4j.* 属性来配置驱动程序的各个方面。以下示例展示了如何配置要使用的 URI 和凭据:

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

自动配置的 Driver 是使用 org.neo4j.driver.Config$ConfigBuilder 创建的。要微调其配置,请声明一个或多个 ConfigBuilderCustomizer Bean。每个 ConfigBuilderCustomizer 都会按顺序被调用,并传入用于构建 Driverorg.neo4j.driver.Config$ConfigBuilder

Spring Data Neo4j Repositories

Spring Data 包含对 Neo4j 的仓库支持。有关 Spring Data Neo4j 的完整详细信息,请参阅 参考文档

Spring Data Neo4j 与其他许多 Spring Data 模块一样,共享 Spring Data JPA 的通用基础设施。你可以采用之前提到的 JPA 示例,将 City 定义为 Spring Data Neo4j 的 @Node,而不是 JPA 的 @Entity,其仓库抽象的工作方式完全相同,如下例所示:

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);

}

spring-boot-starter-data-neo4j starter 启用了仓库(repository)支持以及事务管理。Spring Boot 支持经典和响应式(reactive)两种 Neo4j 仓库,分别使用 Neo4jTemplateReactiveNeo4jTemplate Bean。当 Project Reactor 在 classpath 中可用时,响应式风格也会被自动配置。

通过扫描来发现 Repositories 和实体。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableNeo4jRepositories@EntityScan 来自定义查找 repositories 和实体的位置。

备注

在使用响应式风格的应用程序中,ReactiveTransactionManager 不会被自动配置。要启用事务管理,必须在你的配置中定义以下 Bean:

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);
}

}

Elasticsearch

Elasticsearch 是一个开源的、分布式的、RESTful 的搜索和分析引擎。Spring Boot 为 Elasticsearch 客户端提供了基本的自动配置。

Spring Boot 支持多种客户端:

Spring Boot 提供了一个专用的 starter: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](http://localhost:9200)。你可以使用 spring.elasticsearch.* 属性进一步调整客户端的配置方式,如下例所示:

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

使用 Rest5Client 连接到 Elasticsearch

如果你在 classpath 中包含 co.elastic.clients:elasticsearch-rest5-client,Spring Boot 将自动配置并注册一个 Rest5Client bean。除了前面描述的属性之外,为了对 Rest5Client 进行更精细的调优,你可以注册任意数量实现 Rest5ClientBuilderCustomizer 的 bean,以进行更高级的自定义。若要完全控制客户端的配置,请定义一个 Rest5ClientBuilder bean。

此外,可以自动配置一个 Sniffer,以自动从正在运行的 Elasticsearch 集群中发现节点,并将这些节点设置到 Rest5Client Bean 上。你可以进一步调整 Sniffer 的配置方式,如下例所示:

spring.elasticsearch.restclient.sniffer.enabled=true
spring.elasticsearch.restclient.sniffer.interval=10m
spring.elasticsearch.restclient.sniffer.delay-after-failure=30s

使用 ElasticsearchClient 连接到 Elasticsearch

如果你使用了 spring-boot-starter-elasticsearch,或者在 classpath 中添加了 co.elastic.clients:elasticsearch-java,Spring Boot 将自动配置并注册一个 ElasticsearchClient bean。

ElasticsearchClient 使用的传输层依赖于前面描述的 Rest5Client。因此,前面描述的属性可用于配置 ElasticsearchClient。此外,你可以定义一个 Rest5ClientOptions Bean,以进一步控制传输层的行为。

使用 ReactiveElasticsearchClient 连接到 Elasticsearch

Spring Data Elasticsearch 提供了 ReactiveElasticsearchClient,用于以响应式方式查询 Elasticsearch 实例。如果你的 classpath 中包含 Spring Data Elasticsearch 和 Reactor,Spring Boot 将自动配置并注册一个 ReactiveElasticsearchClient

ReactiveElasticsearchClient 使用的传输层依赖于前面描述的 Rest5Client。因此,前面描述的属性可用于配置 ReactiveElasticsearchClient。此外,你可以定义一个 Rest5ClientOptions Bean,以进一步控制传输层的行为。

使用 Spring Data 连接到 Elasticsearch

要连接到 Elasticsearch,必须定义一个 ElasticsearchClient bean,该 bean 可由 Spring Boot 自动配置,或由应用程序手动提供(参见前面的章节)。有了此配置后,即可像注入其他 Spring bean 一样注入 ElasticsearchTemplate,如下例所示:

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);
}

}

在存在 spring-data-elasticsearch 和 Reactor 的情况下,Spring Boot 还可以自动配置一个 ReactiveElasticsearchClient 和一个 ReactiveElasticsearchTemplate 作为 Bean。它们是其他 REST 客户端的响应式等效物。

Spring Data Elasticsearch Repositories

Spring Data 包含对 Elasticsearch 的仓库支持。与前面讨论的 JPA 仓库类似,其基本原理是根据方法名称自动为你构建查询。

事实上,Spring Data JPA 和 Spring Data Elasticsearch 共享相同的基础架构。你可以采用前面的 JPA 示例,假设 City 现在是一个 Elasticsearch @Document 类,而不是 JPA @Entity,它将以同样的方式工作。

通过扫描可以找到 Repositories 和 documents。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableElasticsearchRepositories@EntityScan 来自定义查找 repositories 和 documents 的位置。

提示

有关 Spring Data Elasticsearch 的完整详细信息,请参阅 参考文档

Spring Boot 支持经典和响应式 Elasticsearch 仓库,分别使用 ElasticsearchTemplateReactiveElasticsearchTemplate Bean。只要存在所需的依赖项,这些 Bean 很可能由 Spring Boot 自动配置。

如果你想使用自己的模板来支持 Elasticsearch 仓库,只要将其命名为 "elasticsearchTemplate",就可以添加你自己的 ElasticsearchTemplateElasticsearchOperations @Bean。同样的规则也适用于 ReactiveElasticsearchTemplateReactiveElasticsearchOperations,对应的 Bean 名称为 "reactiveElasticsearchTemplate"

你可以选择通过以下属性来禁用仓库支持:

spring.data.elasticsearch.repositories.enabled=false

Cassandra

Cassandra 是一个开源的分布式数据库管理系统,旨在跨大量普通服务器处理海量数据。Spring Boot 为 Cassandra 以及 Spring Data Cassandra 提供的上层抽象提供了自动配置支持。此外,还有一个 spring-boot-starter-data-cassandra starter,用于以便捷的方式收集相关依赖。

连接到 Cassandra

你可以像注入其他 Spring Bean 一样,注入一个自动配置的 CqlTemplateCassandraTemplate,或一个 Cassandra CqlSession 实例。可以使用 spring.cassandra.* 属性来自定义连接。通常,你会提供 keyspace-namecontact-points 以及本地数据中心名称,如下例所示:

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

如果所有 contact points 的端口都相同,你可以使用快捷方式,仅指定主机名,如下例所示:

spring.cassandra.keyspace-name=mykeyspace
spring.cassandra.contact-points=cassandrahost1,cassandrahost2
spring.cassandra.local-datacenter=datacenter1
提示

这两个示例是相同的,因为端口默认为 9042。如果需要配置端口,请使用 spring.cassandra.port

通过设置如下示例中的属性,可以将自动配置的 CqlSession 配置为使用 SSL 与服务器通信:

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

自定义的 SSL 信任材料可以在 SSL bundle 中配置,并如本例所示应用到 CqlSession

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

Cassandra 驱动程序拥有自己的配置基础设施,会在 classpath 根目录下加载一个 application.conf 文件。

Spring Boot 默认不会查找此类文件,但可以通过 spring.cassandra.config 加载一个。如果某个属性同时存在于 spring.cassandra.* 和配置文件中,则 spring.cassandra.* 中的值优先。

对于更高级的驱动程序自定义,你可以注册任意数量实现 DriverConfigLoaderBuilderCustomizer 的 Bean。CqlSession 可通过类型为 CqlSessionBuilderCustomizer 的 Bean 进行自定义。

备注

如果你使用 CqlSessionBuilder 来创建多个 CqlSession Bean,请注意该构建器是可变的,因此请确保为每个会话注入一个全新的副本。

以下代码清单展示了如何注入一个 Cassandra bean:

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);
}

}

如果你添加了自己类型为 CassandraTemplate@Bean,它将替换默认的实现。

Spring Data Cassandra Repositories

Spring Data 包含对 Cassandra 的基本仓库支持。目前,这比前面讨论的 JPA 仓库功能更有限,需要使用 @Query 注解的查找方法。

Repository 和实体通过扫描来发现。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableCassandraRepositories@EntityScan 来自定义 Repository 和实体的扫描位置。

提示

有关 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.* 属性可用于自定义连接。通常,你需要提供 connection string 以及用于身份验证的凭据。以下示例展示了如何配置使用用户名和密码的基本身份验证:

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

客户端证书 可用于身份验证,以替代用户名和密码。包含客户端证书的 Java KeyStore 的位置和密码可以按如下示例进行配置:

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

PEM 编码的证书和私钥可以按如下示例进行配置:

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

也可以自定义一些 ClusterEnvironment 设置。例如,以下配置将打开新 Bucket 的超时时间进行了修改,并启用了 SSL 支持,同时引用了一个已配置的 SSL bundle

spring.couchbase.env.timeouts.connect=3s
spring.couchbase.env.ssl.bundle=example
提示

有关更多细节,请查看 spring.couchbase.env.* 属性。若需更精细的控制,可以使用一个或多个 ClusterEnvironmentBuilderCustomizer Bean。

Spring Data Couchbase Repositories

Spring Data 包含对 Couchbase 的仓库支持。

通过扫描可以找到 Repositories 和 documents。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableCouchbaseRepositories@EntityScan 来自定义查找 repositories 和 documents 的位置。

有关 Spring Data Couchbase 的完整详细信息,请参阅 参考文档

你可以像注入其他任何 Spring Bean 一样注入一个自动配置的 CouchbaseTemplate 实例,前提是存在一个可用的 CouchbaseClientFactory Bean。当如上所述存在一个可用的 Cluster 并且已指定 bucket 名称时,就会发生这种情况:

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

以下示例展示了如何注入一个 CouchbaseTemplate bean:

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();
}

}

你可以定义一些 Bean 来覆盖自动配置所提供的 Bean,包括:

为避免在你自己的配置中硬编码这些名称,你可以复用 Spring Data Couchbase 提供的 BeanNames。例如,你可以按如下方式自定义要使用的转换器:

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()));
}

}

LDAP

LDAP(Lightweight Directory Access Protocol)是一种开放、厂商中立的行业标准应用协议,用于通过 IP 网络访问和维护分布式目录信息服务。Spring Boot 为任何符合 LDAP 标准的服务器提供了自动配置支持,并且还支持来自 UnboundID 的嵌入式内存 LDAP 服务器。

LDAP 抽象由 Spring Data LDAP 提供。有一个 spring-boot-starter-data-ldap starter 可以方便地收集相关依赖。

连接到 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 属性。

基于这些设置,会自动配置一个 LdapContextSource。如果存在一个 DirContextAuthenticationStrategy Bean,它将被关联到自动配置的 LdapContextSource。如果你需要自定义该组件,例如使用 PooledContextSource,你仍然可以注入自动配置的 LdapContextSource。请确保将你自定义的 ContextSource 标记为 @Primary,以便自动配置的 LdapTemplate 能够使用它。

Spring Data LDAP Repositories

Spring Data 包含对 LDAP 的仓库支持。

Repository 和文档通过扫描来发现。默认情况下,会扫描 自动配置包。你可以分别使用 @EnableLdapRepositories@EntityScan 来自定义查找 Repository 和文档的位置。

提示

有关 Spring Data LDAP 的完整详细信息,请参阅 参考文档

你也可以像注入其他任何 Spring Bean 一样,注入一个自动配置的 LdapTemplate 实例,如下例所示:

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);
}

}

嵌入式内存 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 值,但由于 distinguished names 通常包含逗号,因此必须使用正确的表示法进行定义。

在 yaml 文件中,可以使用 yaml 列表表示法。在 properties 文件中,必须将索引作为属性名的一部分:

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

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

如果您的 classpath 中存在 schema.ldif 文件,它将被用于初始化服务器。如果您希望从其他资源加载初始化脚本,也可以使用 spring.ldap.embedded.ldif 属性。

默认情况下,会使用一个标准 schema 来验证 LDIF 文件。你可以通过设置 spring.ldap.embedded.validation.enabled 属性来完全关闭验证。如果你有自定义属性,可以使用 spring.ldap.embedded.validation.schema 来定义你的自定义属性类型或对象类。