Spring Boot 3.1 的 ConnectionDetails 抽象

工程 | Moritz Halbritter | 2023 年 6 月 19 日 | ...

如果您使用 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.urlspring.datasource.usernamespring.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 数据库。

在撰写本文时,有以下子接口

我们希望您喜欢我们对 ConnectionDetails 抽象的简短介绍,并且我们很高兴看到在此基础上构建的酷炫内容!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

抢先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将发生的事件

查看 Spring 社区中所有即将发生的事件。

查看所有