抢先一步
VMware 提供培训和认证,以加速您的进步。
了解更多如果您使用 Spring Boot 有一段时间了,您可能熟悉使用属性设置连接详细信息。例如,您可能使用过 spring.datasource.url
来配置 JDBC 连接。在 Spring Boot 3.1 中,这会继续按您预期的方式工作,但我们稍微修改了内部结构,以将自动配置与属性分离。
现在有一个新的 ConnectionDetails
抽象。此接口对远程服务的连接概念进行建模。如果您查看此接口,您会发现它是空的。它用作标记接口,并由多个其他接口扩展,这些接口对与具体远程服务的连接进行建模,例如,连接到 Redis 服务器的 RedisConnectionDetails
或通过 JDBC 连接到数据库服务器的 JdbcConnectionDetails
。
我们添加 ConnectionDetails
抽象主要是为了支持我们全新的 Docker Compose 和 Testcontainers 功能,我们将在后续博客文章中深入介绍这些功能。但是这种抽象不仅限于 Docker Compose 或 Testcontainers。Spring Boot 中的自动配置已更改为在 ConnectionDetails
可用时使用它们。在这种情况下,它们甚至优先于配置属性。如果没有这样的 ConnectionDetails
bean,则将使用这些属性。
让我们看一下 JdbcConnectionDetails
接口
public interface JdbcConnectionDetails extends ConnectionDetails {
String getUsername();
String getPassword();
String getJdbcUrl();
}
这是 Spring Boot 连接到 JDBC 数据库所需了解的所有信息。URL 包含要使用的 JDBC 驱动程序、要连接的主机、要使用的端口等。用户名和密码用于身份验证。这相当于设置 spring.datasource.url
、spring.datasource.username
和 spring.datasource.password
属性。
请注意,该接口不包含与 JDBC 连接相关的所有方法。例如,连接池配置不是合同的一部分。此接口仅处理连接到远程服务所需的信息,连接池大小等其他问题仍通过属性进行配置。
这种抽象很有用,因为在将来的某个时候,可以在此基础上构建其他有趣的集成。例如,在 VMware Tanzu 云中运行的 Spring Boot 应用程序可以发现与该应用程序关联的数据库,并自动提供一个 JdbcConnectionDetails
(或反应式应用程序的 R2dbcConnectionDetails
)bean,该 bean 知道如何连接到该数据库。对于您作为用户而言,这意味着减少了使用 Kubernetes 配置映射和密钥的时间,因为应用程序“只是知道”如何连接到数据库。您将有更多时间专注于生活中的重要事情,例如解决业务问题和参加 sprint 会议!
您可能想知道,当已经可以为连接详细信息贡献属性时,为什么还需要新的接口。 实际上,在 application.properties
之外使用连接属性非常常见。 例如,在使用 Testcontainers 编写集成测试时,经常使用 @DynamicPropertySource
功能。
在应用程序配置之外使用属性的问题是它们可能会更改(并且过去也发生过,例如 spring.redis
属性),这会导致脆弱的耦合。如果属性名称更改,则设置这些属性的代码仍会编译,因为它都是“字符串”类型。当使用 ConnectionDetails
提供有关如何连接到远程服务的信息时,如果我们进行向后不兼容的更改(并且没有充分的理由,我们不会这样做,我们保证!),这将导致编译错误。这比在生产中发现中断要好得多。
如果您想自己使用 ConnectionsDetails
抽象,您需要做的就是定义一个具有正确类型的 bean,例如
@Configuration(proxyBeanMethods = false)
class MyConnectionDetailsConfiguration {
@Bean
JdbcConnectionDetails myJdbcConnectionDetails() {
return new JdbcConnectionDetails() {
@Override
public String getUsername() {
return "myuser";
}
@Override
public String getPassword() {
return "3xtr3mly-s3cr3t";
}
@Override
public String getJdbcUrl() {
return "jdbc:postgresql://postgres-server.svc.local:5432/mydatabase?ssl=true&sslmode=required";
}
};
}
}
现在,Spring Boot 将自动使用这些信息来连接到给定的 PostgreSQL 数据库。
在撰写本文时,有以下子接口
CassandraConnectionDetails
CouchbaseConnectionDetails
ElasticsearchConnectionDetails
JdbcConnectionDetails
KafkaConnectionDetails
MongoConnectionDetails
Neo4jConnectionDetails
R2dbcConnectionDetails
RabbitConnectionDetails
RedisConnectionDetails
ZipkinConnectionDetails
我们希望您喜欢我们对 ConnectionDetails
抽象的简短介绍,并且我们很高兴看到在此基础上构建的酷炫内容!