領先一步
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。我不得不承認,Maven 2 實際上比 Maven 1 好得多,儘管 Web 專案的 Eclipse 工作區工件的生成還有待改進(例如 WTP 2 支援)。我也錯過了一些其他的東西,但這可能只是我完全缺乏經驗。好處是,我現在不必將所有依賴項打包到我的示例中。
安裝 Maven 後,您可以透過從根目錄執行“mvn test”來執行示例測試。要從示例中生成 Eclipse 專案,請執行以下命令:“mvn -DdownloadSources=true eclipse:eclipse”。要構建 jar 和 war,請使用“mvn package”或“mvn install”以將構建工件新增到您的本地儲存庫。
war 包含一個可以作為“/[context-root]/env”訪問的 servlet:要檢視每個環境的差異,請使用一個名為“app.env”的系統屬性啟動您的 servlet 容器,該屬性儲存環境字母(D、T、A 或 P)。因此,新增到伺服器啟動行的 -Dapp.env=D 將導致應用程式在開發模式下執行,這意味著返回的所有姓氏都將是“Doe”。