來自 SpringOne “超越顯而易見” 演講的程式碼示例

工程 | Joris Kuipers | 2007 年 6 月 25 日 | ...

上週在 SpringOne 大會上,Alef 和我做了一個關於使用 Spring 處理複雜應用程式的演講。這裡所說的複雜性是結構和動態層面的。關於演講的結構部分,我在之前的部落格文章中已經介紹過。動態部分解釋了一些可能的解決方案,以處理部署環境之間的差異。(測試、驗收、生產等)很多人問我是否可以提供我在演講中演示的原始碼。我已將原始碼附加到此部落格文章中,並將簡要解釋其工作原理。希望演講本身最終會在今年晚些時候在parleys.com上提供,這樣您就可以獲得更多關於該主題的背景資訊。

環境感知:支援您的執行時環境

在演講中,我提出,透過使用自定義構建指令碼為每個環境生成部署單元來處理環境差異會帶來幾個缺點。其中之一是,當您的應用程式從例如驗收環境提升到生產環境時,您無法重用您的構建工件(war 或 ear 檔案)。為了解決這些缺點,您必須使您的應用程式環境感知:想辦法確定您的應用程式正在哪個環境中執行,然後配置您的應用程式以對此做出反應。

有幾種方法可以做到這一點:在 Spring 應用程式中,啟用環境相關行為的明顯方法是為每個需要非預設配置的環境提供不同的 bean 定義。我展示了三種方法

  • 首先是為某些環境載入額外的上下文配置檔案。透過使用 bean 定義繼承和覆蓋,您可以在配置時採取適當的操作。當您使用 ContextLoaderListener 配置您的 Web 應用程式上下文時,這需要一些額外的程式碼,這在所附示例的 Web 專案中顯示。順便說一句,這個想法的功勞應該歸功於我的一位前同事(Ezra,謝謝!)
  • 第二種是使用JavaConfig而不是 XML 來定義您的環境相關 bean。然後,您確定要建立哪些 bean 的地方從確定要載入哪些配置檔案轉移到您的 JavaConfig 類。
  • 最後一個示例結合了前兩個示例來確定要使用的 JavaConfig 類,其中為每個環境建立了擴充套件公共基本配置的子類。這展示了將配置放在實際類中的強大功能:您可以使用常規的 Java 繼承和多型性,這模糊了 bean 定義繼承和類繼承之間的區別。

其他方法可能包括自定義FactoryBean實現,例如。

示例

這些示例演示了一個簡單的服務和 DAO 的使用,它們透過名字查詢一個人的姓氏。在預設情況下,只定義了兩個人(Alef 和我)。在開發環境中,我們將使用一個靜態 DAO 實現,它總是返回一個John Doe。在驗收環境中,定義了第三個人(我們的同事 Arjen)。整合測試檢查我們的應用程式在每個環境中是否暴露了正確的行為。

您可以通過幾種方式檢查您的應用程式正在哪個環境中執行:對於這些示例,我使用了一個由 EnvironmentUtils 類使用的系統屬性。其他方式可以是檢查資料庫或 JNDI 登錄檔,例如。

我沒有僅僅壓縮我的 Eclipse 工作區,而是建立了一個Maven 示例 更新:Dave Turanski 友好地將示例更新到 Spring 3.0:最近有幾個人試圖說服我給 Maven 第二次機會,在我幾年前厭惡地放棄它之後。我不得不承認 Maven 2 實際上比 Maven 1 好得多,儘管為 Web 專案生成 Eclipse 工作區工件仍有改進空間(例如 WTP 2 支援)。我還錯過了一些其他東西,但這可能只是我完全缺乏經驗。好的一點是,我現在不必在我的示例中打包所有依賴項。

安裝 Maven 後,您可以透過從根目錄執行“mvn test”來執行示例測試。要從示例生成 Eclipse 專案,請執行以下命令:“mvn -DdownloadSources=true eclipse:eclipse”。要構建 jar 和 war,請使用“mvn package”或“mvn install”將構建工件新增到您的本地儲存庫中。

war 包含一個可訪問的 servlet,路徑為“/[context-root]/env”:要檢視每個環境的差異,請使用名為“app.env”的系統屬性啟動您的 servlet 容器,該屬性包含環境字母(D、T、A 或 P)。因此,將“-Dapp.env=D”新增到伺服器的啟動行將導致應用程式在開發模式下執行,這意味著返回的所有姓氏都將是“Doe”。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有