MVC
把軟件分成模型(Model)、視圖(View)、控制器(Controller)三個基本部分。
事實上對應著
Controller——輸入
用戶交互,將輸入處理成Controller能處理的形式
Model——處理
描述狀態、邏輯規律、運算方法、存儲
View——輸出
當數據經過模型處理發生變化,View通過Controller進行更新。
存在的問題
雖然劃分了MVC,三者之間的關系事實上是相互依賴的,實際上并不分割,三者仍需要整體設計。介紹之前學習一個23種之外,但同樣非常重要的MVC模式。
MVC衍生模式
ADR——MVC思想向WEB應用的轉化
HMVC——為了單獨處理網頁的小區域,掛彈窗廣告的
MVP——解決自動化單元測試,進行模型和視圖的單獨測試
MVVM——通過GUI直接操作領域模型,弱化控制器功能,側重模型和視圖
MVA——為領域模型增加不同的前端界面,WEB、APP、小程序等
后續發展
經典的 MVC 模式
MVC(Model-View-Controller)是一種表現層的設計模式,主要目的是將用戶界面(UI)的邏輯與業務邏輯分離。
Model (模型):代表應用程序的數據和業務規則。它負責數據的存取、驗證和業務處理。
View (視圖):用戶看到的界面,負責展示數據(從Model獲取)和接收用戶輸入。它不包含業務邏輯。
Controller (控制器):接收用戶的請求,調用Model進行處理,并根據結果選擇相應的View返回給用戶。它是Model和View之間的協調者。
在早期Java Web開發(如Servlet/JSP時代)中的實現:
View:JSP 頁面,主要負責顯示。
Controller:Servlet,接收HTTP請求,處理參數。
Model:JavaBean(POJO),或者直接在Servlet中調用JDBC進行數據庫操作。
存在的問題:
職責不清:Servlet(Controller)往往承擔了太多工作,如參數解析、業務邏輯調用、數據庫操作(DAO)、數據校驗、選擇視圖等,容易變成“上帝類”(God Class),非常臃腫。
高度耦合:業務邏輯、數據訪問邏輯和表現層邏輯混雜在一起,任何一方的修改都可能影響其他部分,難以測試和維護。
復用性差:業務邏輯被寫在Servlet中,無法在其他地方復用。
三層架構(3-Tier Architecture)
為了解決MVC模式中Controller過于臃腫的問題,開發者將應用在縱向(邏輯上)劃分為三個明確的層次,每個層次職責單一。這是一種更宏觀的、涵蓋整個應用的架構模式。
表現層 (Presentation Layer / Web Layer)
職責:處理用戶交互,接收請求,渲染響應。
對應MVC:包含了MVC中的 Controller 和 View。
技術實現:Spring MVC 中的 @Controller, @RestController, JSP, Thymeleaf 等。
業務邏輯層 (Business Logic Layer / Service Layer)
職責:包含應用程序的核心業務邏輯。它協調多個數據訪問操作,處理事務、權限、日志等跨領域關注點。
技術實現:Spring 的 @Service 組件。
數據訪問層 (Data Access Layer / Persistence Layer)
職責:負責與數據庫進行交互,執行CRUD(增刪改查)操作。
技術實現:DAO (Data Access Object) 模式,Spring 的 @Repository 組件,通常使用 JPA、MyBatis、Hibernate 等ORM框架。
與MVC的關系:
你可以將三層架構理解為對MVC中“Model”部分的細化。原本臃腫的Model被拆解為了Service層和DAO層,而MVC中的 C和V 則共同構成了三層架構中的表現層。
MVC 組件 在三層架構中的對應部分
Controller 表現層的一部分
View 表現層的一部分
Model 被拆分為 業務邏輯層 和 數據訪問層
此時的架構圖:
text
用戶請求 -> [表現層 (Controller/View)] -> [業務邏輯層 (Service)] -> [數據訪問層 (DAO/Repository)] -> 數據庫
響應 <- <-
Spring Framework
Spring 框架的出現極大地促進和規范了三層架構的實現。
IoC (控制反轉) / DI (依賴注入):這是最核心的貢獻。Spring 容器負責創建和管理各層對象(Bean),并自動將它們注入到需要的地方(如將 Repository 注入到 Service,將 Service 注入到 Controller)。這徹底解決了層與層之間的硬編碼耦合問題,使得各層可以獨立開發、測試和替換。
聲明式事務管理:通過在Service層使用 @Transactional 注解,可以將復雜的事務管理從業務代碼中剝離,由Spring代理實現,大大簡化了開發。
AOP (面向切面編程):允許將像日志、安全、事務這樣的橫切關注點模塊化,然后透明地應用到業務邏輯中,使得業務代碼更加純凈和專注。
豐富的集成支持:Spring 對各類ORM框架(Hibernate, JPA, MyBatis)、Web框架(Spring MVC)提供了無縫集成,讓開發者可以專注于各層的業務實現,而不是技術整合。
總結:Spring框架為三層架構提供了成熟的、標準化的實現手段和解耦工具。
Spring Boot
Spring Boot 并不是一個新的架構,它是對基于Spring的三層架構開發的進一步簡化和完善,主打“約定大于配置”。
自動化配置 (Auto-Configuration):
Spring Boot 根據項目依賴(如classpath下是否有MySQL驅動、Spring Data JPA等)自動配置應用程序所需的Bean和基礎設施。
這避免了在傳統Spring項目中編寫大量繁瑣的XML或Java配置,讓開發者幾乎可以“開箱即用”。
嵌入式Web服務器:
內置Tomcat、Jetty等服務器,可以將應用打包成一個獨立的、可執行的JAR文件,無需部署到外部Web容器。這簡化了部署和運維。
Starter依賴:
提供一系列“啟動器”(如 spring-boot-starter-web, spring-boot-starter-data-jpa),通過一個依賴就能引入整個功能模塊所需的所有jar包,避免了依賴地獄。
Actuator:
提供生產級特性,如監控應用健康狀態、指標收集等,使得三層架構的應用不僅易于開發,還易于運維。