Spring Boot 3.1 的 ConnectionDetails 抽象

工程 | 莫里茨·哈爾布里特 | 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 ConfigMaps 和 Secrets 上浪費時間,因為應用程式“僅僅知道”如何連線到資料庫。您將有更多時間專注於生活中的重要事情,例如解決業務問題和參加 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 社群所有即將舉行的活動。

檢視所有