領先一步
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。 對於您來說,這意味著減少了擺弄 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 資料庫。
在撰寫本文時,有以下子介面
CassandraConnectionDetails
CouchbaseConnectionDetails
ElasticsearchConnectionDetails
JdbcConnectionDetails
KafkaConnectionDetails
MongoConnectionDetails
Neo4jConnectionDetails
R2dbcConnectionDetails
RabbitConnectionDetails
RedisConnectionDetails
ZipkinConnectionDetails
我們希望您喜歡我們對 ConnectionDetails
抽象的小小導覽,我們很高興看到將在此基礎上建立哪些很酷的東西!