領先一步
VMware 提供培訓和認證,以加速您的進展。
深入了解上週在 SpringOne,Alef 和我針對使用 Spring 處理複雜應用程式進行了一場演講。此處的複雜性考量了結構和動態層面。關於演講的結構部分,我在我之前的部落格文章中涵蓋了這一點。動態部分解釋了一些可能的解決方案,以處理部署環境之間的差異(測試、驗收、生產等)。很多人問我是否可以提供我在演講中展示的範例原始碼。我已將原始碼附加到這篇部落格文章中,並將簡要說明其運作方式。希望這次演講最終能在今年稍後於 parleys.com 上公開,以便您可以更深入了解此主題的背景資訊。
在演講中,我論證了透過使用自訂建置腳本來產生每個環境的部署單元,以處理環境之間的差異存在一些缺點。其中一個缺點是,當您的應用程式從例如驗收環境升級到生產環境時,您無法重複使用您的建置產物(war 或 ear 檔案)。為了解決這些缺點,您必須讓您的應用程式具備環境感知能力:想出某種方法來判斷您的應用程式在什麼環境中執行,然後設定您的應用程式以對此做出反應。
有很多方法可以做到這一點:在 Spring 應用程式中,啟用環境相關行為的明顯方法是為每個需要非預設設定的環境設定不同的 Bean 定義。我展示了三種方法來做到這一點
其他方法可能包括自訂 FactoryBean 實作,例如。
這些範例示範了如何使用簡單的 Service 和 DAO,透過名字找到 Person 的姓氏。在預設情況下,僅定義了兩個人(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'。