Ramnivas Laddad
以程式設計方式使用 Spring Cloud
在上一篇部落格中,我向您展示瞭如何使用Spring Cloud的 Java 配置選項以宣告方式獲取服務聯結器(如果您需要,還支援 XML 名稱空間)。在本部落格中,我們將仔細研究如何以程式設計方式使用 Spring Cloud。這將有助於在無法使用 Java 或 XML 配置的情況下。它還將揭示 Spring Cloud 的工作原理,併為本系列的下一篇部落格做準備,我們將在其中討論擴充套件 Spring Cloud。
要使用 Spring Cloud,我們需要訪問 Cloud 類的物件。但是,您不能直接建立 Cloud 物件(它的建構函式不是公共的)。相反,您將透過 CloudFactory 獲取它...
Spring Cloud 簡介
開發、部署和操作雲應用程式應該像本地應用程式一樣容易(甚至更容易)。這是並且應該成為任何雲平臺、庫或工具的指導原則。Spring Cloud——一個開源庫——使得為雲開發 JVM 應用程式變得容易。有了它,應用程式可以輕鬆地連線到服務並發現多個雲(如 Cloud Foundry 和 Heroku)中的雲環境資訊。此外,您可以將其擴充套件到其他雲平臺和新服務。
在本系列的第一篇部落格中,我將介紹 Spring Cloud,並從應用程式開發人員的角度展示其用法。我們將開發一個簡單的應用程式並部署到Cloud Foundry和Heroku...
將 Cloud Foundry 服務與 Spring 結合使用:第 2 部分 - 自動重新配置
如果您觀看了Cloud Foundry 啟動活動的影片,您會看到我們部署了從 Spring Web Flow 示例下載的 Spring Travel 應用程式,為其綁定了一個 MySQL 服務,並將應用程式拖放到 STS 中的 Cloud Foundry 伺服器,而無需對應用程式本身進行任何更改。應用程式配置為使用本地資料庫,這怎麼可能呢?這就是自動重新配置發揮作用的時候。
Cloud Foundry 致力於降低您的初始投資。除了金錢之外,真正的投資來自於開發人員的時間...
將 Cloud Foundry 服務與 Spring 結合使用:第 1 部分 - 基礎知識
Cloud Foundry 提供的服務使得編寫高效且有效的應用程式成為可能。開發人員現在可以選擇最合適的服務,而無需擔心操作這些服務。例如,應用程式的一部分可以選擇 Postgres 用於事務訪問至關重要的部分,MongoDB 用於將資料作為文件集合進行互動有意義的部分,Redis 用於鍵值是正確抽象的部分,以及 RabbitMQ 用於訊息傳遞有助於建立有效架構的部分。在這個由四部分組成的部落格系列中,我們將探討 Spring 應用程式如何使用 Cloud Foundry...
領域物件依賴注入功能的新改進
Spring 的依賴注入 (DI) 機制允許配置應用程式上下文中定義的 bean。如果您想將相同的思想擴充套件到非 bean 呢?Spring 對領域物件 DI 的支援利用 AspectJ 織入將 DI 擴充套件到任何物件,即使它是由 Web 或 ORM 框架建立的。這使得建立具有豐富領域行為的物件成為可能,因為領域物件現在可以與注入的物件協作。在本部落格中,我將討論 Spring 框架在此領域的最新改進。
領域物件 DI 背後的核心思想非常簡單:一個 AspectJ 織入切面選擇與任何符合特定規範的物件的建立或反序列化對應的連線點。對這些連線點的通知將依賴項注入到正在建立或反序列化的物件中。當然,魔鬼在細節中。例如,如何選擇與反序列化對應的連線點,或者如何每個物件只注入一次依賴項?透過提供一些預先編寫的...
新的 bean() 切入點
Spring 2.5 引入了一個新的切入點指示符——bean(),它允許選擇名稱模式匹配的 bean 中的連線點。現在可以使用自動代理機制以及 Spring-AspectJ 整合來選擇特定的 bean,即使存在多個相同型別的 bean。之前,您可以使用 BeanNameAutoProxyCreator 實現類似的結果;但是,該機制不適用於模式樣式或 @AspectJ 切面。
除了選擇特定的 bean,如果遵循適當的命名約定,這個切入點指示符還提供了兩種有趣的方式來選擇 bean
- 選擇 bean 的垂直切片:如果您遵循 bean 名稱包含指示其業務角色字串的約定,則 bean() 切入點可以根據其業務角色選擇 bean。例如,如果您遵循 bean 名稱以表示其業務功能的字串開頭的約定,則可以使用 bean(account*) 切入點選擇所有與會計相關的 bean,例如 accountRepository、accountService 和 accountController。
- 選擇 bean 的水平切片:如果您遵循 bean 名稱包含指示其架構角色字串的約定,則 bean() 切入點可以根據其架構角色選擇 bean。例如,如果您遵循 bean 名稱以表示其架構角色的字串結尾的約定,則可以使用 bean(*Repository) 選擇所有儲存庫 bean。如果沒有 bean() 切入點,您必須依賴包結構或基於型別的切入點,這有時可能有點過於嚴格。
圖 1:使用 bean() 切入點根據 bean 名稱選擇 bean 的水平和垂直切片
此切入點代表 AspectJ 切入點表示式語言的 Spring 特定擴充套件,因此僅在基於 Spring 的應用程式中有用。名稱模式遵循 AspectJ 的名稱模式匹配規則,其中 '*' 是唯一允許的萬用字元。下表顯示了一些示例切入點及其選擇的 bean。| 切入點 | 選擇的連線點 |
|---|---|
| bean(accountRepository) | 名為“accountRepository”的 bean |
| !bean(accountRepository) | 除“accountRepository”bean 之外的任何 bean |
| bean(*) | 任何 bean |
| bean(account*) | 名稱以“account”開頭的任何 bean |
| bean(*Repository) | 名稱以“Repository”結尾的任何 bean |
| bean(accounting/showaccount) | 名為 accounting/showaccount 的 bean(例如,指定處理該 URL 的控制器) |
| bean(accounting/*) | 名稱以“accounting/”開頭的任何 bean(例如,指定處理與會計相關的 URL 的任何控制器) |
| bean(accounting/*/edit) | 名稱以“accounting/”開頭並以“/edit”結尾的任何 bean(例如,指定處理與會計相關的編輯操作功能的任何控制器) |
| bean(*dataSource) || bean(*DataSource) | 名稱以“dataSource”或“DataSource”結尾的任何 bean |
| bean(service:name=monitoring) | 名為“service:name=monitoring”的 bean |