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 社群中所有即將發生的事件。

檢視所有