| 維度 | Spring Framework | Struts 2 |
|---|---|---|
| 核心定位 | 企業級應用全棧容器 (IoC/AOP + 模組化) | Web 表現層 MVC 框架 |
| 架構層級 | 涵蓋表現、業務、持久、整合各層 | 專注 Controller/View 層 |
| 耦合度 | 非侵入式,POJO 開發 | Action 需繼承/實作特定介面 (早期),後期改善 |
| 核心機制 | IoC 容器管理 Bean 生命週期與依賴 AOP 實現橫切關注點 (事務、安全、日誌) | 攔截器鏈處理請求 ValueStack/OGNL 數據綁定 結果類型多樣化 |
| 擴展性 | 模組化:Spring MVC, Spring Data, Spring Security, Spring Cloud... | 插件機制:Convention, REST, JSON, Tiles... |
Spring 最核心貢獻:將物件創建與依賴關係外部化到容器。開發者宣告介面與實作,容器負責實例化、注入、生命週期管理。實現「面向介面編程」,極大降低模組耦合。
// XML 配置 (傳統)
// 註解配置 (現代主流)
@Service
public class UserServiceImpl implements UserService {
@Autowired private UserDao userDao; // 建構子注入更佳
}
將交易、安全、快取、日誌等「橫切邏輯」從業務代碼中分離,以切面形式聲明式織入。
@Aspect
@Component
public class TxAspect {
@Around("@annotation(Transactional)")
public Object manageTx(ProceedingJoinPoint pjp) throws Throwable {
// 開啟事務 -> 執行 -> 提交/回滾
}
}
// 業務方法僅需 @Transactional,零侵入
FilterDispatcher 攔截請求。defaultStack:paramsPrepareParamsStack + validation + workflow...)。歷史上極常見組合:Struts 2 負責 Web 控制層,Spring 管理 Service/Dao/事務/整合。
ContextLoaderListener 啟動 Spring 容器。StrutsSpringPlugin 讓 Struts Action 交由 Spring 管理 (可注入 Service)。class="beanId" 而非全限定類名。| 場景 | 推薦 | 理由 |
|---|---|---|
| 新專案 (單體/微服務) | Spring Boot + Spring MVC (或 WebFlux) | 自動配置、內嵌容器、生態完整、雲原生就緒 |
| 維護舊 Struts 2 專案 | 持續使用 Struts 2 + Spring | 避免大規模重寫風險,升級 Spring 版本獲益 |
| 純 API 服務 | Spring MVC @RestController / WebFlux | 無 JSP/FreeMarker 包袱,效能更高 |
| 學習 MVC 原理 | 手寫 Servlet + 簡易 Front Controller | 理解 DispatcherServlet、HandlerMapping、ViewResolver 本質 |
Spring 是「應用程式骨架」,提供 IoC 容器、AOP、事務抽象、資料存取模板、整合適配器等基礎設施;Struts 2 是「Web 處理器」,專注請求映射、數據綁定、視圖解析。兩者**不互斥、可整合**,但現代開發 Spring MVC (Spring Boot 內建) 已完整替代 Struts 2 的功能,並提供更優雅的註解驅動開發體驗。