在開始討論 Spring 的原理之前,我們需要先了解 Spring Framework 是什麼以及它在 Java 開發中的角色。Spring Framework 是一個開放源碼的輕量級容器框架,用於簡化企業應用程式的開發。它提供了一個 IoC(控制反轉)/ DI(依賴注入)容器來管理物件的生命週期和相依性,並且支持 AOP(面向切面程式設計)來實現跨域功能如日誌記錄和安全。
Spring Framework 的核心概念
Inversion of Control (IoC) and Dependency Injection (DI):
IoC 和 DI 是 Spring Framework 的基礎概念。在傳統的 Java 程式中,我們習慣使用 new 運算符直接創建物件並設定其相依性。然而,這種方式會導致高耦合的代碼,使得系統難以維護和管理。而透過 IoC/DI,我們將物件的創建和相依性的配置從使用者的程式代碼中移除,交由 Spring Container 負責。這就是所謂的控制權的反轉。
DI 則是 IoC 的一種實踐方法,指的是將相依性作為參數傳遞給其他類別的方式。這樣可以讓我們更加靈活地為不同環境配置不同的相依性,比如測試環境可以使用 mock object 代替實際服務。
Aspect Oriented Programming (AOP):
AOP 是一種編程模式,允許我們將橫向切割關注點分離出來,例如安全性、監控、日誌記錄等,而不影響原始的業務邏輯。在 Spring 中,AOP 通過代理機制來實現,其中最常見的是 JDK dynamic proxy 和 CGLIB。當一個 bean 被標註了 @Aspect 註解時,Spring 在初始化這個 bean 的時候會自動創建一個代理對象。這個代理對像會截獲到特定的 join point(連接點),並執行相應的通知(advice)。
Application Context:
Application Context 是 Spring 的另一個核心概念,它提供了 IoC 容器的上下文環境。與 BeanFactory 相比,它增加了更多的功能,例如支援資源定位和事件處理。在 Spring 中,你可以選擇使用 XML、Annotation 或者 Java Configuration 來定義你的 beans 和 configure your application context.
Spring MVC
Spring MVC 是 Spring Framework 的一部分,專門用於 web 應用程式開發。它的設計原則基於模型-視圖-控制器模式(MVC Pattern),將網頁請求分離成不同的部分以便於管理和維護。Spring MVC 的核心組件包括控制器(Controller)、模型(Model)、前端控制器(DispatcherServlet)和 ViewResolver 等。
Controllers:
Controllers 是處理用戶請求的第一站。它們接收用戶輸入,驗證數據,並根據需要更新資料庫或調用服務層的方法。最後,控制器會返回一個 ModelAndView 對象,包含要顯示的資料和對應的 view name。
Models:
Models 代表應用程序的資料狀態。它通常是一個 Map 或其他可序列化的結構,用來存放 controller 準備呈現給客戶端的資料。這些資料可能來自資料庫查詢、API 呼叫或者其他任何來源。
Views:
Views 是資料的展示方式,它可以是 HTML 模板、FreeMarker 模板、Thymeleaf 模板等等。Spring MVC 支持多種視圖技術,並且提供了方便的 Helper classes 和 tags library 來幫助開發者快速生成合適的輸出格式。
DispatcherServlet:
DispatcherServlet 是整個 Spring MVC 架構的核心。它負責接受 HTTP 請求,解析 request parameters, headers 等資訊,然後將請求委派給相應的路徑匹配的控制器進行處理。處理完畢後,再根據控制器返回的結果決定如何渲染 view。
ViewResolvers:
ViewResolvers 負責將 controller 返回的 view name 轉換為實際的 View instance。Spring 有內建的 VelocityViewResolver 和 InternalResourceViewResolver,分別用於解析 Velocity templates 和 JSPs。
總之,Spring Framework 提供了豐富的功能和模塊來協助開發者建立健壯且易於維護的 Java 應用程式。理解其核心概念對於有效地利用 Spring 框架至關重要。