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。 對於您來說,這意味著減少了擺弄 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 社群中所有即將舉行的活動。

查看全部