每日面試題20:spring和spring boot的區別

我曾經寫過一道面試題,題目是為什么springboot項目可以直接打包給別人運行?其實這涉及到的就是springboot的特點。今天來簡單了解一下springboot和spring的區別,

Spring 與 Spring Boot:從“全能框架”到“開箱即用”的進化之路


一、核心定位:Spring 是“地基”,Spring Boot 是“精裝房”

要理解兩者的差異,首先需要明確它們的核心定位:

1. Spring:企業級開發的“全能基礎設施”

Spring 框架誕生于 2002 年,由 Rod Johnson 在其著作《Expert One-on-One J2EE Development without EJB》中提出。它的核心目標是通過??輕量級設計??,解決傳統 J2EE 開發中“重量級容器”(如 EJB)的臃腫問題,為企業級應用提供一套??標準化、可擴展的開發框架??。

Spring 的核心能力圍繞兩大設計模式展開:

  • ??IoC(控制反轉)??:將對象的創建、依賴管理和生命周期交給容器(Spring Container),而非由代碼直接控制。例如,一個 UserService 需要調用 UserRepository,傳統方式需手動 new UserRepository(),而 Spring 中只需通過 @Autowired 聲明依賴,容器會自動注入實例。
  • ??AOP(面向切面編程)??:將日志記錄、權限校驗、事務管理等“橫切關注點”從核心業務邏輯中剝離,通過“切面”統一實現。例如,為所有接口添加日志記錄,無需在每個方法中重復編寫 log.info() 代碼。

Spring 的“全能”體現在其強大的兼容性:它支持 XML/注解配置、整合 MyBatis/Hibernate 等 ORM 框架、對接 Redis/RabbitMQ 等中間件,甚至能與企業級標準(如 JPA、JMS)無縫集成。但也正因如此,Spring 的學習和使用門檻較高——開發者需要同時掌握框架本身的核心機制,以及各類依賴的整合技巧。

2. Spring Boot:讓 Spring“開箱即用”的“腳手架”

隨著 Spring 生態的擴張,項目配置的復雜度急劇上升:一個典型的 Spring Web 應用可能需要配置數據源、事務管理器、Web 服務器、日志框架……每個環節都需要編寫大量 XML 或 Java Config 代碼。即使是簡單的“Hello World”應用,也可能需要 10+ 個配置文件。

2014 年,Spring Boot 1.0 發布,喊出“??約定大于配置??(Convention Over Configuration)”的口號,目標是??消除繁瑣的配置??,讓開發者能“零配置”快速啟動一個可運行的 Spring 應用。它的本質是“Spring 的增強版工具集”,通過以下方式重構了開發體驗:

  • ??自動化配置??:內置大量“默認配置”,只需引入依賴(如 spring-boot-starter-web),Spring Boot 會自動裝配 Web 服務器(Tomcat)、Spring MVC 等組件,無需手動配置。
  • ??內嵌式容器??:應用可直接打包為 JAR/WAR,通過 java -jar 命令運行,無需依賴外部 Tomcat/Jetty 等服務器。
  • ??Starter 依賴管理??:將常用功能(如數據庫、緩存、安全)封裝為“起步依賴”(如 spring-boot-starter-data-jpa),一個依賴即可引入整套關聯庫及默認配置。

簡言之,Spring Boot 不是替代 Spring,而是通過“??配置簡化??”和“??工程提效??”,讓開發者能更專注于業務邏輯本身,而非框架的底層實現。


二、核心差異對比:從“手動組裝”到“自動交付”

為了更直觀地展示兩者的區別,我們從??配置管理??、??工程結構??、??生態擴展??三個維度進行對比:

??維度????Spring(傳統方式)????Spring Boot??
??配置方式??依賴 XML 或 Java Config 手動配置(如 applicationContext.xml@Configuration 類)自動化配置為主,僅需通過 application.properties/application.yml 覆蓋默認值
??依賴管理??需手動管理大量 jar 包(如 Spring Core、Spring MVC、Jackson 等),易出現版本沖突通過 Starter 依賴“一站式”引入(如 spring-boot-starter-web 自動包含 MVC、Tomcat、Jackson)
??啟動方式??需部署到外部 Web 服務器(如 Tomcat),通過 catalina.sh run 啟動打包為可執行 JAR,直接 java -jar demo.jar 運行
??工程結構??靈活但需遵循規范(如 src/main/javasrc/main/resources),無強制約束推薦“約定式結構”(如 controllerservicedao 分層目錄),降低學習成本
??擴展能力??高度靈活,可通過自定義 Bean、AOP 切面、Bean 后處理器等深度定制框架行為兼容 Spring 所有擴展方式,同時提供 Actuator(監控)、Auto-configuration(自動配置)等增強工具

三、典型案例:用 Spring vs Spring Boot 實現“Hello World”

通過一個簡單的 Web 應用示例,能更直觀地感受兩者的差異。

場景:實現一個返回“Hello World”的 REST 接口

??傳統 Spring 實現(以 Spring 5 + XML 配置為例)??
  1. ??創建 Maven 項目??,手動添加 5+ 個依賴(spring-contextspring-webmvcjavax.servlet-api 等)。
  2. ??配置 Web 服務器??:在 web.xml 中聲明 DispatcherServlet,關聯 Spring MVC 的配置文件。
  3. ??配置 Spring MVC??:在 spring-mvc.xml 中啟用注解驅動(<mvc:annotation-driven/>)、組件掃描(<context:component-scan base-package="com.example"/>)。
  4. ??編寫 Controller??:
    @Controller
    public class HelloController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "Hello World";}
    }
  5. ??部署運行??:將項目打包為 WAR,部署到外部 Tomcat 服務器,啟動后訪問 http://localhost:8080/hello

??痛點??:僅“Hello World”就需要配置 Web 服務器、Spring 上下文、MVC 組件,且依賴版本沖突風險高。


??Spring Boot 實現??
  1. ??創建 Spring Boot 項目??:通過 Spring Initializr 選擇 Web 依賴(自動生成 pom.xml,包含 spring-boot-starter-web)。
  2. ??編寫 Controller??(無需額外配置):
    @RestController
    public class HelloController {@GetMapping("/hello")public String hello() {return "Hello World";}
    }
  3. ??運行應用??:直接執行 main 方法(Spring Boot 內置 Tomcat,自動啟動):
    @SpringBootApplication
    public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
    }
  4. ??訪問測試??:啟動后直接訪問 http://localhost:8080/hello,無需任何額外部署。

??優勢??:0 配置啟動、依賴自動管理、內嵌服務器,開發效率提升 80% 以上。


四、如何選擇?Spring 與 Spring Boot 的適用場景

盡管 Spring Boot 已成為主流,但 Spring 并未被淘汰。兩者的選擇需結合具體場景:

  • ??選 Spring 的情況??:

    • 需要深度定制 Spring 框架底層邏輯(如自定義 IoC 容器、AOP 增強);
    • 項目依賴非常特殊(如使用已淘汰的舊版本庫,無法通過 Starter 整合);
    • 學習階段需要深入理解 IoC/AOP 等核心原理(Spring 是最佳學習素材)。
  • ??選 Spring Boot 的情況??:

    • 快速開發業務系統(如管理后臺、API 服務);
    • 團隊需要降低新人上手成本(約定式結構 + 自動化配置);
    • 微服務架構(Spring Boot 是 Spring Cloud 的基礎,天然支持服務發現、配置中心等)。

總結:Spring 是根,Spring Boot 是枝葉

Spring 定義了企業級 Java 開發的“游戲規則”(IoC/AOP),而 Spring Boot 則是將這套規則“產品化”的工具——它不是替代,而是進化。正如 Spring Boot 官方文檔所說:“??Spring Boot 讓 Spring 應用的創建、配置和部署變得前所未有的簡單??”。

對于開發者而言,掌握 Spring 核心原理(IoC/AOP)是基礎,而熟練使用 Spring Boot 提升開發效率則是現代 Java 工程師的必備技能。兩者的結合,正是 Java 生態“既穩又快”發展的最佳注腳。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92164.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ClickHouse數據遷移

ClickHouse實例是阿里云上的云實例&#xff0c;想同步數據到本地&#xff0c;本地部署有ClickHouse實例&#xff0c;下面為單庫單表 源實例&#xff1a;阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目標實例&#xff1a;本地172.16.22.10:8123 1、目標實例建…

sqli-labs-master/Less-41~Less-50

Less-41這一關還是用堆疊注入&#xff0c;這關數字型不需要閉合了。用堆疊的話&#xff0c;我們就不爆信息了。我們直接用堆疊&#xff0c;往進去寫一條數據?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插進去了沒?id-1 u…

Tiger任務管理系統-10

十是個很好美好的數字&#xff0c;十全十美&#xff0c;確實沒讓人失望&#xff0c;收獲還是很大的。 溫習了前端知識&#xff0c;鞏固了jQuery&#xff0c;thymeleaf等被忽視的框架&#xff0c;意外將之前的所學所用的知識都連起來了&#xff0c;感覺有點像打通了任督二脈一樣…

ora-01658 無法為表空間 users中的段創建initial區

ora-01658 無法為表空間 users中的段創建initial區 參考1 參考2 參考3 參考4 給用戶新增表空間 alter tablespace system add datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM03.DBF size 5G autoextend on next 10M;設置表空間文件自動擴展 ALTER DATABASE DATAFILE /…

lodash的替代品es-toolkit詳解

一、es-toolkit簡介 es-toolkit 是一款先進的高性能 JavaScript 實用程序庫,體積小巧,并支持強類型注釋,典型特征包括: 提供各種日常實用函數并采用現代實現,例如: debounce、delay、chunk、sum 和 pick 等 設計充分考慮了性能,在現代 JavaScript 環境中實現了 2-3 倍…

【原創】基于gemini-2.5-flash-preview-05-20多模態模型實現短視頻的自動化二創

畫面和解說保持一致&#xff0c;這個模型就是NB[16:57:37] [*] 正在從視頻中提取幀和時長 (頻率: 1.0 幀/秒)... [16:57:55] [] 提取完成。視頻時長: 83.40秒, 提取了 84 幀。 [16:57:55] [*] 使用AI供應商: gemini [16:57:55] [*] 正在進行視覺分析... [16:57:55] L-> 正…

數倉架構 數據表建模

數倉架構 主要用來描述 數據加工的實時鏈路 和 離線鏈路之間的關系,即 流批 關系; lamda 架構, 是兩條路, 實時計算式的, 維護數據的實時性。然后每天經過批計算后, 覆蓋實時的計算結果。 保證數據準確性。 kappa架構, 即流批一體了 數據建模 星型模型是數據倉庫中最…

vscode調試python腳本時無法進入函數內部的解決方法

只需在launch.json配置文件中添加“justMyCode”:false.

Python day37

浙大疏錦行 python day37. 內容&#xff1a; 保存模型只需要保存模型的參數即可&#xff0c;使用的時候直接構建模型再導入參數即可 # 保存模型參數 torch.save(model.state_dict(), "model_weights.pth")# 加載參數&#xff08;需先定義模型結構&#xff09; mod…

ORACLE進階操作

1 事務 事務的任務便是使數據庫從一種狀態變換成為另一種狀態&#xff0c;這不同于文件系統&#xff0c;它是數據庫所特用的。 所有的數據庫中&#xff0c;事務只針對DML&#xff08;增刪改)&#xff0c;不針對select select只能查看其他事務提交或回滾的數據&#xff0c;不能查…

Modbus 的一些理解

疑問&#xff1a;&#xff08;使用的是Modbustcp&#xff09;我在 Modbus slave 上面設置了slave地址為1&#xff0c;位置為40001的位置的值為1&#xff0c;40001這個位置上面的值是怎么存儲的&#xff0c;存儲在哪里的&#xff1f;他們是怎么進行交互的&#xff1f;在Modbus協…

【運動控制框架】WPF運動控制框架源碼,可用于激光切割機,雕刻機,分板機,點膠機,插件機等設備,開箱即用

WPF運動控制框架源碼&#xff0c;可用于激光切割機&#xff0c;雕刻機&#xff0c;分板機&#xff0c;點膠機&#xff0c;插件機等設備&#xff0c;考慮到各運動控制硬件不同&#xff0c;視覺應用功能&#xff08;應用視覺軟件&#xff09;也不同&#xff0c;所以只開發各路徑編…

RabbitMQ-日常運維命令

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。中間件&#xff0c;我給它的定義就是為了實現某系業務功能依賴的軟件&#xff0c;包括如下部分:Web服務器代理…

【Linux基礎知識系列】第九十篇 - 使用awk進行文本處理

在Linux系統中&#xff0c;文本處理是一個常見的任務&#xff0c;尤其是在處理日志文件、配置文件和數據文件時。awk是一個功能強大的文本處理工具&#xff0c;廣泛用于數據提取、分析和格式化。它不僅可以處理簡單的文本文件&#xff0c;還可以處理復雜的結構化數據&#xff0…

第二十七天(數據結構:圖)

圖&#xff1a;是一種非線性結構形式化的描述: G{V,R}V:圖中各個頂點元素(如果這個圖代表的是地圖&#xff0c;這個頂點就是各個點的地址)R:關系集合&#xff0c;圖中頂點與頂點之間的關系(如果是地圖&#xff0c;這個關系集合可能就代表的是各個地點之間的距離)在頂點與頂點…

數據賦能(386)——數據挖掘——迭代過程

概述重要性如下&#xff1a;提升挖掘效果&#xff1a;迭代過程能不斷優化數據挖掘模型&#xff0c;提高挖掘結果的準確性和有效性&#xff0c;從而更好地滿足業務需求。適應復雜數據&#xff1a;數據往往具有復雜性和多樣性&#xff0c;通過迭代可以逐步探索和適應數據的特點&a…

什么是鍵值緩存?讓 LLM 閃電般快速

一、為什么 LLMs 需要 KV 緩存&#xff1f;大語言模型&#xff08;LLMs&#xff09;的文本生成遵循 “自回歸” 模式 —— 每次僅輸出一個 token&#xff08;如詞語、字符或子詞&#xff09;&#xff0c;再將該 token 與歷史序列拼接&#xff0c;作為下一輪輸入&#xff0c;直到…

16.Home-懶加載指令優化

問題1&#xff1a;邏輯書寫位置不合理問題2&#xff1a;重復監聽問題已經加載完畢但是還在監聽

Day116 若依融合mqtt

MQTT 1.MQTT協議概述MQTT是一種基于發布/訂閱模式的輕量級消息傳輸協議&#xff0c;設計用于低帶寬、高延遲或不穩定的網絡環境&#xff0c;廣泛應用于物聯網領域1.1 MQTT協議的應用場景1.智能家居、車聯網、工業物聯網&#xff1a;MQTT可以用于連接各種家電設備和傳感器&#…

PyTorch + PaddlePaddle 語音識別

PyTorch PaddlePaddle 語音識別 目錄 概述環境配置基礎理論數據預處理模型架構設計完整實現案例模型訓練與評估推理與部署性能優化技巧總結 語音識別&#xff08;ASR, Automatic Speech Recognition&#xff09;是將音頻信號轉換為文本的技術。結合PyTorch和PaddlePaddle的…