Spring Framework

Spring 上課筆記 (3)

基本介紹

教學目標

初步了解 MVC 的基本概念。

重點概念

一般來說應用程式控制器主要會執行五個步驟,分別為取得資料、轉換資料、驗證資料、觸發商業邏輯和選擇下一個檢視方式。然而撰寫應用程式控制器的方式耦合很高且非常繁雜,因此 Spring MVC 則是以 Command Design Pattern 的方式實作前端控制器與應用程式控制器進行互動,讓控制器更具低耦合的特性,我們只需要透過設定檔的簡化方式就能夠進行視圖和模型的關聯。

所謂 MVC 是 T.Reenskaug 在 1979 年應用於 GUI 架構的管理,全名為 Model-View-Controller,首先視圖會發請求給控制器,接著控制器會更新模型的狀態,再來模型會通知視圖相關更新,此時視圖會從模型中讀取狀態,最後控制器會針對視圖進行控制,其中 MVC 最重要在於模型要能夠通知視圖狀態已更新。

但是 Web 應用程式主要是基於 HTTP 的請求/回應模型,因此模型無法主動更新視圖,也因此才有適用於 Web 應用程式的 MVC Model 2 又稱 Web MVC,最早概念源自於 1998 年 JSP 的規格書中第一個模型描述一個請求傳送給 JSP 檔案,第二個模型描述一個請求傳送給 Servlet,接著在 1999 年 Govind Seshadri 在 JavaWorld 發表了「Understanding JavaServer Pages Model 2 architecture」的文章確認 Model 2 為針對 Web 應用程式的 MVC 架構。

最後 Spring MVC 則是實作前端控制器,主要透過 web.xml 定義 DispatcherServlet,首先接收 HTTP 請求,接著將請求傳給應用程式控制器處理請求,再來更新模型,同時控制視圖,此時視圖會讀取狀態,並且進行 HTTP 的回應操作。

相關資源

Spring 上課筆記 (1)

基本介紹

教學目標

初步了解 Spring Framework 的基本概念。

重點概念

Spring Framework 之父是 R.Johnson,他在 2002 年出版書籍「J2EE Design and Development」主要以架構描述的方式進行發表,並且在 2003 年再以開放原始碼的形式釋出第一版本。在當時有許多 Java 企業領域的開放原始碼在實務上皆有很不錯的表現,主要可以分為展現層、永續層和商務層,其中展現層以 Structs Framework 為主,永續層主要以 Hibernate 為主,然而卻只有商務層除了 EJB 之外,並沒有適合的開發原始碼,此時 Spring 就能解決此痛點。

首先設計理念主要是透過介面進行系統設計,以傳統 Java 物件為主,非侵入性,可模組化的輕量級服務,以及提供一致性的設定檔格式。接著架構主要有五大重點,分別為 Bean 容器、永續性相關機制支援、Spring AOP、Web 相關技術支援以及 Java EE 相關技術支援。再來理論基礎,主要為控制權倒置 (Inversion of Control,IoC) 和依賴性注入 (Dependency Injection,DI),深入了解理論基礎將有助於我們評估是否需用採用 Spring Framework。

所謂控制權倒置主要是將函式庫的重用方式改為框架的重用方式,其中核心概念有二個,第一個是在父類別中撰寫主流程,稱為 Template Method。第二個是在可變的部份以子類別負責實作的抽象方法為主。在 Template Method 中,我們將主流程封裝在父類別中,則稱為應用程式框架,其中內含主流程的父類別就是框架,透過繼承重用主流程的子類別就是元件,只要置換不同的子類別就能呈現不同的行為。

所謂依賴性主要是指當某一個類別繼承另一個類別、實作另一個介面或叫用到其它類別,我們就說此類別依賴另一個類別。一般來說依賴性感低,程式的可重用性會愈高。此外若我們要透過 Spring Framework 降低依賴性,基本上可透過 POJO 為基礎的程式設計,透過 AOP 來將特定的技術邏輯,也就是非功能方面的需求注入元件中,此外在執行時期 Spring 會做為元件之間的中間人將依賴關係進行注入。一般來說,我們會使用 new 運算子來產生物件,並且使用 setter 方法建立關係,透過 Factory 將物 件產生象化並且進行包裝,再將生成物件的責任委派給 Factory,此時可以設計一種的泛用的 Factory 專門用來產生並且組裝物件,就是所謂「輕量級容器」。接著當我們在使用輕量級容器時,實質上是物件生成的控制權的倒置,又稱 IoC Container 。但是框架重用的 IoC 指的是主流程主控權的倒置,而 IoC Container 中的 IoC 指的是物件生成主控權的倒置,因為容易造成混淆,所以 M.Fowler 建議使用依賴注入 (Dependency Injection,DI) 用於指稱物件生成主控權的倒置,其中依賴注入主要有三種型式,分別為 Setter Injection、Constructor Injection 和 Interface Injection,然而 Interface Injection 具有較強的侵入性,所以 Spring 只採用 Setter Injection 和 Constructor Injection。

總結 Spring 是個全方位的應用程式框架,主要功能為輕量級容器、實作依賴注入和非侵入性的框架、提供 AOP 機制應用於非功能性的需求、提供持久層和交易層的支援、提供 MVC Web 框架的實現… 等應用。

相關連結