SpringOne 'Beyond the obvious' 研討會的程式碼範例

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

上週在 SpringOne,Alef 和我針對使用 Spring 處理複雜應用程式進行了一場演講。此處的複雜性考量了結構和動態層面。關於演講的結構部分,我在我之前的部落格文章中涵蓋了這一點。動態部分解釋了一些可能的解決方案,以處理部署環境之間的差異(測試、驗收、生產等)。很多人問我是否可以提供我在演講中展示的範例原始碼。我已將原始碼附加到這篇部落格文章中,並將簡要說明其運作方式。希望這次演講最終能在今年稍後於 parleys.com 上公開,以便您可以更深入了解此主題的背景資訊。

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

在演講中,我論證了透過使用自訂建置腳本來產生每個環境的部署單元,以處理環境之間的差異存在一些缺點。其中一個缺點是,當您的應用程式從例如驗收環境升級到生產環境時,您無法重複使用您的建置產物(war 或 ear 檔案)。為了解決這些缺點,您必須讓您的應用程式具備環境感知能力:想出某種方法來判斷您的應用程式在什麼環境中執行,然後設定您的應用程式以對此做出反應。

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

  • 第一種是為特定環境載入額外的 Context 設定檔。透過使用 Bean 定義繼承和覆寫,您可以於設定時採取適當的動作。當您使用 ContextLoaderListener 來設定您的 Web 應用程式 Context 時,這需要一些額外的程式碼,這在附加範例的 Web 專案中顯示。順帶一提,這個想法應歸功於我以前的一位同事(Ezra,謝謝!)
  • 第二種是使用 JavaConfig 而不是 XML 來定義您的環境相關 Bean。您決定要建立哪些 Bean 的位置,然後從決定要載入哪些設定檔轉移到您的 JavaConfig 類別。
  • 最後一個範例結合了前兩種方法,以決定要使用哪個 JavaConfig 類別,其中為每個環境建立擴充通用基礎設定的子類別。這展現了將您的設定放在實際類別中的強大功能:您可以使用常規的 Java 繼承和多型,這模糊了 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'。

取得 Spring 電子報

訂閱 Spring 電子報,保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

深入了解

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

深入了解

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部