从零开始搭建第一个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.mzph.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; 看图找规律…