領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多上週在 SpringOne 大會上,Alef 和我做了一個關於使用 Spring 處理複雜應用程式的演講。這裡所說的複雜性是結構和動態層面的。關於演講的結構部分,我在之前的部落格文章中已經介紹過。動態部分解釋了一些可能的解決方案,以處理部署環境之間的差異。(測試、驗收、生產等)很多人問我是否可以提供我在演講中演示的原始碼。我已將原始碼附加到此部落格文章中,並將簡要解釋其工作原理。希望演講本身最終會在今年晚些時候在parleys.com上提供,這樣您就可以獲得更多關於該主題的背景資訊。
在演講中,我提出,透過使用自定義構建指令碼為每個環境生成部署單元來處理環境差異會帶來幾個缺點。其中之一是,當您的應用程式從例如驗收環境提升到生產環境時,您無法重用您的構建工件(war 或 ear 檔案)。為了解決這些缺點,您必須使您的應用程式環境感知:想辦法確定您的應用程式正在哪個環境中執行,然後配置您的應用程式以對此做出反應。
有幾種方法可以做到這一點:在 Spring 應用程式中,啟用環境相關行為的明顯方法是為每個需要非預設配置的環境提供不同的 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”。