從零開始搭建第一個Spring Boot應用:從入門到精通

1. Spring Boot簡介與核心概念

1.1 什么是Spring Boot?

Spring Boot是Spring框架的一個擴展,它簡化了基于Spring的應用程序的初始搭建和開發過程。通過自動配置和約定優于配置的原則,Spring Boot讓開發者能夠快速啟動和運行項目。

通俗理解:想象你要開一家咖啡店。傳統Spring就像是從零開始—你需要自己選購咖啡機、磨豆機、設計店面、招聘員工等。而Spring Boot則像是加盟一家知名咖啡連鎖店—總部已經為你準備好了標準化的設備、裝修方案和運營流程,你只需要按需調整即可快速開業。

1.2 Spring Boot核心特性

特性專業解釋日常生活類比
自動配置Spring Boot根據項目依賴自動配置Spring應用像智能家居系統,根據你家的設備自動調整燈光、溫度等設置
起步依賴預定義的依賴組合,簡化構建配置像預制菜套餐,已經搭配好了主菜、配菜和調料,不用單獨購買每樣食材
內嵌服務器內置Tomcat、Jetty等服務器,無需部署WAR文件像自帶發動機的房車,不需要另外準備拖車
命令行界面支持命令行交互,便于快速原型開發像快餐店的自助點餐機,快速獲取所需功能
Actuator提供生產級監控和管理功能像汽車的儀表盤,實時顯示各項運行指標

1.3 Spring Boot vs 傳統Spring MVC

對比維度Spring Boot傳統Spring MVC
項目搭建快速,幾分鐘復雜,需要大量配置
配置方式約定優于配置,自動配置顯式配置所有內容
依賴管理起步依賴簡化管理需要手動管理所有依賴
部署方式內置服務器,可執行JAR需要外部服務器,部署WAR
開發效率高,專注于業務邏輯較低,需要處理基礎設施
學習曲線平緩陡峭

2. 環境準備與項目創建

2.1 系統要求

  • JDK 1.8或更高版本(推薦JDK 11或17)
  • Maven 3.3+或Gradle 6.x+
  • IDE(IntelliJ IDEA、Eclipse或VS Code)

2.2 創建Spring Boot項目的三種方式

方式1:使用Spring Initializr(在線工具)
  1. 訪問 https://start.spring.io
  2. 選擇:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 最新穩定版
    • Group: com.example (你的公司域名倒寫)
    • Artifact: demo
    • Packaging: Jar
    • Java: 11或17
  3. 添加依賴:Spring Web
  4. 點擊"Generate"下載項目壓縮包
方式2:使用IDE(IntelliJ IDEA為例)
  1. File → New → Project
  2. 選擇"Spring Initializr"
  3. 填寫項目信息(同在線工具)
  4. 選擇依賴:Spring Web
  5. 點擊"Finish"
方式3:手動創建Maven項目并添加依賴
  1. 創建標準Maven項目
  2. 在pom.xml中添加Spring Boot父項目:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> <!-- 使用最新版本 -->
</parent>
  1. 添加起步依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

2.3 項目結構解析

demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/
│   │   │       └── DemoApplication.java  # 主啟動類
│   │   └── resources/
│   │       ├── static/      # 靜態資源(JS,CSS,圖片)
│   │       ├── templates/   # 模板文件(Thymeleaf等)
│   │       └── application.properties # 配置文件
│   └── test/                # 測試代碼
├── pom.xml                  # Maven構建文件

通俗理解:項目結構就像一家餐廳的布局:

  • src/main/java是廚房(核心業務邏輯)
  • resources/static是餐廳裝修(靜態展示)
  • resources/templates是菜單模板(動態內容)
  • application.properties是餐廳的運營手冊(配置)

3. 編寫第一個Spring Boot應用

3.1 主啟動類解析

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // 核心注解,組合了@Configuration, @EnableAutoConfiguration和@ComponentScan
public class DemoApplication {public static void main(String[] args) {// 啟動Spring Boot應用SpringApplication.run(DemoApplication.class, args);}
}

注解解析

  • @SpringBootApplication:是以下三個注解的組合
    • @Configuration:標記該類為配置類
    • @EnableAutoConfiguration:啟用自動配置
    • @ComponentScan:自動掃描當前包及其子包下的組件

3.2 創建第一個REST控制器

讓我們創建一個處理咖啡訂單的控制器:

package com.example.demo.controller;import org.springframework.web.bind.annotation.*;@RestController // 表示這是一個REST控制器,返回數據而非視圖
@RequestMapping("/coffee") // 基礎路徑
public class CoffeeController {// GET /coffee/menu - 獲取咖啡菜單@GetMapping("/menu")public String getMenu() {return "今日特供: 美式咖啡(20元), 拿鐵(25元), 卡布奇諾(25元)";}// POST /coffee/order - 下單咖啡@PostMapping("/order")public String placeOrder(@RequestParam String type, @RequestParam(required = false, defaultValue = "1") int quantity) {double price = 0;switch (type) {case "美式": price = 20; break;case "拿鐵":case "卡布奇諾": price = 25; break;default: return "抱歉,我們沒有" + type + "咖啡";}double total = price * quantity;return "成功下單 " + quantity + "杯" + type + "咖啡,總價: " + total + "元";}// GET /coffee/info/{id} - 根據ID獲取咖啡信息@GetMapping("/info/{id}")public String getCoffeeInfo(@PathVariable int id) {String[] coffees = {"美式咖啡: 濃郁的黑咖啡", "拿鐵: 咖啡與牛奶的完美融合", "卡布奇諾: 帶有奶泡的意式咖啡"};if (id >= 1 && id <= coffees.length) {return coffees[id - 1];}return "未找到對應的咖啡信息";}
}

3.3 運行應用并測試

  1. 運行DemoApplication中的main方法
  2. 應用默認啟動在8080端口
  3. 使用Postman或瀏覽器測試:
    • GET http://localhost:8080/coffee/menu
    • POST http://localhost:8080/coffee/order?type=拿鐵&quantity=2
    • GET http://localhost:8080/coffee/info/1

4. Spring Boot核心功能詳解

4.1 自動配置原理

Spring Boot的自動配置是通過@EnableAutoConfiguration實現的。它會:

  1. 檢查classpath下的依賴
  2. 根據存在的依賴自動配置相應的Spring組件

示例:當classpath中有spring-boot-starter-web時,Spring Boot會自動:

  • 配置內嵌Tomcat服務器
  • 配置Spring MVC
  • 注冊默認的JSON轉換器(Jackson)

4.2 配置文件詳解

Spring Boot支持兩種格式的配置文件:

  1. application.properties
  2. application.yml(更推薦)

示例配置

# application.yml
server:port: 9090 # 修改服務器端口spring:datasource:url: jdbc:mysql://localhost:3306/coffee_shopusername: rootpassword: secretdriver-class-name: com.mysql.cj.jdbc.Drivercoffee:special-offer: "周一拿鐵半價"shop-name: "Spring Boot咖啡屋"

在代碼中讀取配置:

@RestController
public class CoffeeShopController {@Value("${coffee.shop-name}") // 注入配置值private String shopName;@Value("${coffee.special-offer}")private String specialOffer;@GetMapping("/shop-info")public String getShopInfo() {return shopName + " 今日特惠: " + specialOffer;}
}

4.3 常用起步依賴介紹

起步依賴功能日常生活類比
spring-boot-starter-webWeb開發支持餐廳的基礎設施(桌椅、餐具)
spring-boot-starter-data-jpaJPA數據庫支持餐廳的庫存管理系統
spring-boot-starter-thymeleaf模板引擎餐廳的菜單設計工具
spring-boot-starter-test測試支持餐廳的質量檢測設備
spring-boot-starter-security安全支持餐廳的安保系統

5. 數據庫集成與JPA使用

5.1 添加JPA和MySQL依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

5.2 創建實體類

package com.example.demo.entity;import javax.persistence.*;@Entity // 表示這是一個JPA實體
@Table(name = "coffee") // 對應的表名
public class Coffee {@Id // 主鍵@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增private Long id;@Column(nullable = false) // 非空列private String name;@Column(precision = 5, scale = 2) // 精度控制(總位數5,小數位2)private Double price;// 省略構造方法、getter和setter...
}

5.3 創建Repository接口

package com.example.demo.repository;import com.example.demo.entity.Coffee;
import org.springframework.data.jpa.repository.JpaRepository;public interface CoffeeRepository extends JpaRepository<Coffee, Long> {// 根據名稱查詢Coffee findByName(String name);// 查詢價格低于指定值的咖啡List<Coffee> findByPriceLessThan(Double price);
}

5.4 使用Repository

@Service
public class CoffeeService {@Autowiredprivate CoffeeRepository coffeeRepository;public List<Coffee> getAllCoffees() {return coffeeRepository.findAll();}public Coffee addCoffee(Coffee coffee) {return coffeeRepository.save(coffee);}public List<Coffee> getAffordableCoffees(Double maxPrice) {return coffeeRepository.findByPriceLessThan(maxPrice);}
}

6. 異常處理與REST最佳實踐

6.1 自定義異常

public class CoffeeNotFoundException extends RuntimeException {public CoffeeNotFoundException(Long id) {super("找不到ID為 " + id + " 的咖啡");}
}

6.2 全局異常處理

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(CoffeeNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ErrorResponse handleCoffeeNotFound(CoffeeNotFoundException ex) {return new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());}// 其他異常處理...
}// 簡單的錯誤響應類
class ErrorResponse {private int status;private String message;// 構造方法、getter和setter...
}

6.3 RESTful設計最佳實踐

操作HTTP方法示例路徑描述
獲取所有GET/coffees獲取所有咖啡
獲取單個GET/coffees/{id}獲取特定ID的咖啡
創建POST/coffees創建新咖啡
更新全部PUT/coffees/{id}更新整個咖啡資源
更新部分PATCH/coffees/{id}部分更新咖啡資源
刪除DELETE/coffees/{id}刪除咖啡

7. 測試Spring Boot應用

7.1 單元測試

@SpringBootTest
class CoffeeServiceTest {@Autowiredprivate CoffeeService coffeeService;@Testvoid shouldAddCoffee() {Coffee coffee = new Coffee("摩卡", 28.0);Coffee saved = coffeeService.addCoffee(coffee);assertNotNull(saved.getId());assertEquals("摩卡", saved.getName());}
}

7.2 控制器測試

@WebMvcTest(CoffeeController.class)
class CoffeeControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate CoffeeService coffeeService;@Testvoid shouldReturnCoffeeMenu() throws Exception {mockMvc.perform(get("/coffee/menu")).andExpect(status().isOk()).andExpect(content().string(containsString("今日特供")));}
}

8. 打包與部署

8.1 打包為可執行JAR

mvn clean package
# 生成的JAR文件在target目錄下

8.2 運行應用

java -jar target/demo-0.0.1-SNAPSHOT.jar

8.3 生產環境建議

  1. 使用spring-boot-starter-actuator添加監控端點
  2. 配置適當的日志級別
  3. 使用application-prod.yml存放生產環境配置
  4. 考慮使用Docker容器化部署

9. 進階功能與擴展

9.1 緩存集成

@Service
public class CoffeeService {@Cacheable("coffees") // 緩存結果public Coffee getCoffeeById(Long id) {// 數據庫查詢...}
}

需要在啟動類添加@EnableCaching注解

9.2 定時任務

@Service
public class DailySpecialService {@Scheduled(cron = "0 0 9 * * ?") // 每天上午9點執行public void updateDailySpecial() {// 更新每日特惠...}
}

需要在啟動類添加@EnableScheduling注解

9.3 異步處理

@Service
public class EmailService {@Async // 異步執行public void sendOrderConfirmation(String email, String orderDetails) {// 發送郵件...}
}

需要在啟動類添加@EnableAsync注解

10. 總結與最佳實踐

10.1 Spring Boot開發流程總結

  1. 使用Spring Initializr創建項目
  2. 添加必要的起步依賴
  3. 編寫實體類和Repository
  4. 實現業務服務
  5. 創建REST控制器
  6. 配置應用程序屬性
  7. 編寫測試
  8. 打包部署

10.2 推薦的項目結構

src/
├── main/
│   ├── java/
│   │   └── com/example/
│   │       ├── config/        # 配置類
│   │       ├── controller/    # 控制器
│   │       ├── entity/        # 實體類
│   │       ├── repository/    # 數據訪問層
│   │       ├── service/       # 業務邏輯層
│   │       ├── dto/           # 數據傳輸對象
│   │       ├── exception/     # 自定義異常
│   │       └── DemoApplication.java
│   └── resources/
│       ├── static/
│       ├── templates/
│       ├── application.yml
│       └── application-dev.yml
└── test/└── java/└── com/example/├── controller/├── service/└── DemoApplicationTests.java

10.3 常見問題與解決方案

問題可能原因解決方案
啟動時報端口占用8080端口被其他程序占用修改server.port或關閉占用程序
自動配置不生效包掃描范圍不正確確保主類在根包下,或使用@ComponentScan指定
數據庫連接失敗配置錯誤或數據庫服務未啟動檢查配置,確保數據庫服務運行
依賴沖突引入了不兼容的版本使用mvn dependency:tree分析,排除沖突依賴
靜態資源無法訪問路徑錯誤或緩存問題檢查資源位置,清除瀏覽器緩存

通過這篇全面指南,你應該已經掌握了從零開始搭建Spring Boot應用的所有關鍵步驟。記住,Spring Boot的強大之處在于它的"約定優于配置"理念,讓你可以專注于業務邏輯而非基礎設施。隨著實踐的深入,你會越來越體會到它的便利和高效。

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

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

相關文章

c# LINQ-Query01

文章目錄 查詢數據源標準查詢分兩類即時查詢已推遲流式處理非流式處理分類表聚合Aggregate<TSource,TAccumulate,TResult>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>, Func<TAccumulate,TResult>)Aggregate<TSour…

AI惡魔之眼使用說明書

AI惡魔之眼使用說明書 產品簡介 1.1 產品介紹 AI惡魔之眼是一款具備動態視覺效果與仿生眼睛模擬功能的智能顯示產品&#xff0c;可實現以下特性&#xff1a; 真實人眼模擬&#xff1a;支持虹膜樣式變換、眨眼動畫、瞳孔縮放等動態特效&#xff0c;仿真度高自定義內容上傳&am…

CAN報文逆向工程

在沒有DBC文件的情況下解析CAN報文獲取物理信息需要逆向工程和系統分析。以下是詳細步驟&#xff1a; 1. 數據采集與基礎分析 采集原始數據&#xff1a; 使用CAN分析工具&#xff08;如PCAN-Explorer、SavvyCAN或USB-CAN適配器配套軟件&#xff09;記錄車輛在不同狀態下的CAN數…

KL散度(Kullback-Leibler Divergence):概率分布差異的量化利器

目錄 1. 什么是KL散度?關鍵特點:2. KL散度的數學公式離散分布的KL散度公式:連續分布的KL散度公式:3. KL散度的計算示例示例1:離散分布示例2:連續分布(高斯分布)4. KL散度的核心性質1. 非對稱性2. 非負性3. 與熵的關系5. KL散度與相關性的關系1. KL散度 ≠ 相關性2. 間接…

二叉樹的遍歷與構造

唉&#xff0c;好想回家&#xff0c;我想回家跟饅頭醬玩&#xff0c;想老爸老媽。如果上天再給我一次選擇的機會&#xff0c;我會選擇當一只小動物&#xff0c;或者當棵大樹也好&#xff0c;或者我希望自己不要有那么多多余的情緒&#xff0c;不要太被別人影響&#xff0c;開心…

leetcode 141. Linked List Cycle

題目描述&#xff1a; 代碼&#xff1a; 用哈希表也可以解決&#xff0c;但真正考察的是用快慢指針法。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Soluti…

AI輔助DevOps與自動化測試:重構軟件工程效率邊界

隨著AI技術滲透至軟件開發生命周期&#xff0c;DevOps與自動化測試領域正經歷顛覆性變革。本文系統性解析AI在需求分析、測試用例生成、部署決策、異常檢測等環節的技術實現路徑&#xff0c;結合微軟Azure DevOps、Tesla自動駕駛測試等典型場景&#xff0c;探討AI如何突破傳統效…

5月7號.

flex布局: 表單標簽: 表單標簽-表單項:

【AI面試準備】中文分詞與實體抽取技術詳解

分詞&#xff0c;詞性標準 目錄 一、分詞與詞性標注1. **分詞&#xff08;Word Segmentation&#xff09;**2. **詞性標注&#xff08;Part-of-Speech Tagging&#xff09;** 二、實體抽取&#xff08;Named Entity Recognition, NER&#xff09;1. **實體類型示例**2. **輸出…

【AI落地應用實戰】Amazon Bedrock 零門檻使用 DeepSeek-R1:在 Amazon Bedrock 上部署與調用的完整實踐指南

隨著大語言模型&#xff08;LLM&#xff09;技術的快速發展&#xff0c;企業和開發者對具備更強理解與生成能力的模型需求也愈加旺盛。DeepSeek-R1 作為 DeepSeek 公司推出的一款強大開源模型&#xff0c;不僅在多項評測中表現優異&#xff0c;更具備出色的推理能力和長文本處理…

阿里云平臺與STM32的物聯網設計

基于阿里云平臺與STM32的物聯網設計方案可結合硬件選型、通信協議、云端配置及功能實現等多個維度進行設計。以下是綜合多個參考案例的詳細設計方案&#xff1a; 一、硬件選型與架構設計 主控芯片選擇 STM32系列&#xff1a;推薦使用STM32F103&#xff08;如STM32F103ZET6、STM…

IBM BAW(原BPM升級版)使用教程Toolkit介紹

本部分為“IBM BAW&#xff08;原BPM升級版&#xff09;使用教程系列”內容的補充。 一、系統Toolkit 在 IBM Business Automation Workflow (BAW) 中&#xff0c;System Toolkit 是一組預先定義和配置好的工具、功能和組件&#xff0c;旨在幫助流程設計者和開發人員快速構建…

力扣-hot100 (矩陣置零)

73. 矩陣置零 中等 給定一個 *m* x *n* 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示…

安裝并運行第一個Spark程序

安裝并運行第一個Spark程序需要完成以下步驟&#xff1a;安裝Java和Spark&#xff0c;配置環境變量&#xff0c;編寫并運行Spark程序。以下是詳細的教程&#xff1a; 1. 安裝Java Spark需要Java運行環境&#xff08;JRE&#xff09;或Java開發工具包&#xff08;JDK&#xff…

Python Selenium爬蟲功能使用介紹

本文介紹python selenium 爬蟲的功能以及使用 1. 基礎核心功能 瀏覽器控制 from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager# 自動管理瀏覽器驅動 driver webdriver.Chro…

Cloudera CDP 7.1.3 主機異常關機導致元數據丟失,node不能與CM通信

問題描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…

Nginx安全防護與HTTPS部署

目錄 Nginx 隱藏版本號 限制危險請求方法 請求限制&#xff08;CC攻擊防御&#xff09; 壓力測試 防盜鏈 防止防盜鏈 動態黑名單 自動添加黑名單 HTTPS配置 HTTPS 概念 安全通信的四大原則 HTTPS的幾種加密方式 nginx https的作用 Nginx 隱藏版本號 &#xff01;&#xff01;&a…

C++類對象的隱式類型轉換和編譯器返回值優化

文章目錄 前言1. 隱式類型轉換1.1 單參數的隱式類型轉換1.2 多參數的隱式類型轉換1.3 explicit關鍵字 2. 編譯器的優化2.1 普通構造優化2.2 函數傳參優化2.3 函數返回優化 前言 在類與對象的學習過程中&#xff0c;一定會對隱式類型轉換這個詞不陌生。對于內置類型而言&#x…

領麥微紅外溫度傳感器,搖奶器測溫應用

在育兒領域&#xff0c;精準控制奶液溫度是守護寶寶健康的重要環節。領麥微作為MEMS傳感器領域的創新先鋒&#xff0c;通過其紅外測溫傳感器的非接觸式測量、高精度測溫、實時反饋以及智能溫控節能等核心優勢&#xff0c;為搖奶器注入了全新的智能化解決方案。這一技術不僅提升…

第十一屆藍橋杯 2020 C/C++組 蛇形填數

目錄 題目&#xff1a; 題目描述: 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述: 題目鏈接&#xff1a; 蛇形填數 - 藍橋云課 思路&#xff1a; 思路詳解&#xff1a; 看圖找規律…