搶先一步
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 配置對映和金鑰的時間,因為應用程式“只是知道”如何連線到資料庫。您將有更多時間專注於生活中的重要事情,例如解決業務問題和參加 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
抽象的簡短介紹,並且我們很高興看到在此基礎上構建的酷炫內容!