領先一步
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 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 資料庫。
在撰寫本文時,有以下子介面
CassandraConnectionDetails,用於連線到 Cassandra 伺服器CouchbaseConnectionDetails,用於連線到 Couchbase 伺服器ElasticsearchConnectionDetails,用於連線到 Elasticsearch 伺服器JdbcConnectionDetails,用於透過 JDBC 連線到資料庫伺服器KafkaConnectionDetails,用於連線到 Kafka 伺服器MongoConnectionDetails,用於連線到 MongoDB 伺服器Neo4jConnectionDetails,用於連線到 Neo4j 伺服器R2dbcConnectionDetails,用於透過 R2DBC 連線到資料庫伺服器RabbitConnectionDetails,用於連線到 RabbitMQ 伺服器RedisConnectionDetails,用於連線到 Redis 伺服器ZipkinConnectionDetails,用於連線到 Zipkin 伺服器我們希望您喜歡我們對 ConnectionDetails 抽象的簡短介紹,並且我們很期待看到在其之上構建的精彩內容!