多數 IT 組織在發展過程中,都必須直面三大核心課題:降低運營成本、拓展並留住客戶、提升業務流轉效率。要破解這些難題,關鍵在於實現多業務系統間數據與邏輯的無縫互通,亦即導入系統整合工程,打通業務流程,實現數據的共享與訪問。
JPetStore 4.0 是 iBatis 官方發布的最新示例專案,基於 Struts MVC 框架(採用非傳統開發模式),以 iBatis 作為持久層。其設計層次分明、結構優雅,不僅是學習的佳作,更可作為高效開發模型的參考藍本。本文即在此之上,引入 Spring 對中間業務層進行改造,旨在進一步減少開發工作量,同時引入 Spring 的依賴注入、AOP 事務管理等核心優勢。
BeanAction 配合反射機制,並重新定義 Form Bean 使其具備業務行為(近似 BO),大幅簡化編程模型。BeanFactory 解耦介面與實現,並以 AOP 實現聲明式事務管理。專案中唯一的 Struts Action 是 BeanAction,它利用反射根據 URL 動態調用 Form Bean 的對應方法。Form Bean 不再只是數據承載體,還封裝了業務行為(方法簽名簡單,返回 forward 名稱字符串),並透過 ActionContext 工具類與表現層框架解耦。這種模式極大降低了對 Struts 的耦合,便於未來遷移至 JSF 或 Spring MVC。
com.ibatis.jpetstore.presentation 下的 Form Bean(繼承 BaseBean),負責數據綁定、校驗及業務調用。com.ibatis.jpetstore.service 下的 Service 類,封裝業務邏輯與事務控制;persistence.iface 定義 DAO 介面,DaoConfig 作為工廠獲取具體實現。persistence.sqlmapdao 實現 DAO 介面,繼承 BaseSqlMapDao(再繼承 iBatis SqlMapDaoTemplate),SQL 映射文件置於 sql 目錄。domain 包下的 POJO,作為 DTO 貫穿各層。為保留 BeanAction 這一精華不動控制層,本文放棄 ContextLoaderPlugIn,改用自定義 CustomBeanFactory 封裝 XmlBeanFactory,一次性載入 applicationContext.xml,供表現層 Form Bean 通過 getBean() 獲取 Service。因 Form Bean 由 Struts 自動實例化,無法交由 Spring 管理,故需此橋接類實現「耦合 1」解耦。
Form Bean 原以單例工廠獲取 Service,改為 CustomBeanFactory.getBean("AccountService")。雖多引入一個工廠類,但實現了面向介面編程(Service 實現類在 Spring 配置中指定),且工廠類極簡,得益於 Spring 核心 DI 容器的反射機制。
BaseSqlMapDao 繼承 Spring SqlMapClientDaoSupport,引入 SqlMapClientTemplate 執行操作。smcTemplate 執行查詢/更新,方法簽名不變,僅替換實現體,極易批量修改。DaoConfig 工廠類及 dao.xml,改由 Spring 管理 DAO 生命週期。applicationContext.xml 配置數據源、sqlMapClient、事務管理器及各 DAO Bean,實現統一資源管理。以 OrderService 為例,在 Spring 配置中使用 TransactionProxyFactoryBean 代理目標 Bean,注入 ItemDao、OrderDao、SequenceDao,並聲明 insert* 方法需 PROPAGATION_REQUIRED 事務。業務類僅保留屬性及 Setter,構造函數置空,移除手動事務代碼(daoManager.startTransaction() 等),邏輯大幅精簡。
iBatis 賦予 SQL 完全控制權,JPetStore 4.0 融合最佳實踐與設計模式,是輕量級 J2EE Web 應用的優秀起點。本文在最大程度保留原有設計精華、最小代碼變動前提下,引入 Spring 管理業務與持久層,帶來:自然的面向介面編程、依賴注入解耦、統一數據訪問框架、聲明式事務、集中式配置。Spring 模塊化、分層架構讓開發者可按需選用,正如本文所示——只用核心容器與 AOP,輕量而強大。