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(在线工具)
- 访问 https://start.spring.io
- 选择:
- Project: Maven Project
- Language: Java
- Spring Boot: 最新稳定版
- Group: com.example (你的公司域名倒写)
- Artifact: demo
- Packaging: Jar
- Java: 11或17
- 添加依赖:Spring Web
- 点击"Generate"下载项目压缩包
方式2:使用IDE(IntelliJ IDEA为例)
- File → New → Project
- 选择"Spring Initializr"
- 填写项目信息(同在线工具)
- 选择依赖:Spring Web
- 点击"Finish"
方式3:手动创建Maven项目并添加依赖
- 创建标准Maven项目
- 在pom.xml中添加Spring Boot父项目:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version> <!-- 使用最新版本 -->
</parent>
- 添加起步依赖:
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.3 项目结构解析
plain
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 主启动类解析
java
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控制器
让我们创建一个处理咖啡订单的控制器:
java
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 运行应用并测试
- 运行
DemoApplication
中的main方法 - 应用默认启动在8080端口
- 使用Postman或浏览器测试:
4. Spring Boot核心功能详解
4.1 自动配置原理
Spring Boot的自动配置是通过@EnableAutoConfiguration
实现的。它会:
- 检查classpath下的依赖
- 根据存在的依赖自动配置相应的Spring组件
示例 :当classpath中有spring-boot-starter-web
时,Spring Boot会自动:
- 配置内嵌Tomcat服务器
- 配置Spring MVC
- 注册默认的JSON转换器(Jackson)
4.2 配置文件详解
Spring Boot支持两种格式的配置文件:
application.properties
application.yml
(更推荐)
示例配置:
yaml
# application.yml
server:
port: 9090 # 修改服务器端口
spring:
datasource:
url: jdbc:mysql://localhost:3306/coffee_shop
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
coffee:
special-offer: "周一拿铁半价"
shop-name: "Spring Boot咖啡屋"
在代码中读取配置:
java
@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-web | Web开发支持 | 餐厅的基础设施(桌椅、餐具) |
spring-boot-starter-data-jpa | JPA数据库支持 | 餐厅的库存管理系统 |
spring-boot-starter-thymeleaf | 模板引擎 | 餐厅的菜单设计工具 |
spring-boot-starter-test | 测试支持 | 餐厅的质量检测设备 |
spring-boot-starter-security | 安全支持 | 餐厅的安保系统 |
5. 数据库集成与JPA使用
5.1 添加JPA和MySQL依赖
xml
<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 创建实体类
java
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接口
java
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
java
@Service
public class CoffeeService {
@Autowired
private 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 自定义异常
java
public class CoffeeNotFoundException extends RuntimeException {
public CoffeeNotFoundException(Long id) {
super("找不到ID为 " + id + " 的咖啡");
}
}
6.2 全局异常处理
java
@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 单元测试
java
@SpringBootTest
class CoffeeServiceTest {
@Autowired
private CoffeeService coffeeService;
@Test
void shouldAddCoffee() {
Coffee coffee = new Coffee("摩卡", 28.0);
Coffee saved = coffeeService.addCoffee(coffee);
assertNotNull(saved.getId());
assertEquals("摩卡", saved.getName());
}
}
7.2 控制器测试
java
@WebMvcTest(CoffeeController.class)
class CoffeeControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CoffeeService coffeeService;
@Test
void shouldReturnCoffeeMenu() throws Exception {
mockMvc.perform(get("/coffee/menu"))
.andExpect(status().isOk())
.andExpect(content().string(containsString("今日特供")));
}
}
8. 打包与部署
8.1 打包为可执行JAR
bash
mvn clean package
# 生成的JAR文件在target目录下
8.2 运行应用
bash
java -jar target/demo-0.0.1-SNAPSHOT.jar
8.3 生产环境建议
- 使用
spring-boot-starter-actuator
添加监控端点 - 配置适当的日志级别
- 使用
application-prod.yml
存放生产环境配置 - 考虑使用Docker容器化部署
9. 进阶功能与扩展
9.1 缓存集成
java
@Service
public class CoffeeService {
@Cacheable("coffees") // 缓存结果
public Coffee getCoffeeById(Long id) {
// 数据库查询...
}
}
需要在启动类添加@EnableCaching
注解
9.2 定时任务
java
@Service
public class DailySpecialService {
@Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
public void updateDailySpecial() {
// 更新每日特惠...
}
}
需要在启动类添加@EnableScheduling
注解
9.3 异步处理
java
@Service
public class EmailService {
@Async // 异步执行
public void sendOrderConfirmation(String email, String orderDetails) {
// 发送邮件...
}
}
需要在启动类添加@EnableAsync
注解
10. 总结与最佳实践
10.1 Spring Boot开发流程总结
- 使用Spring Initializr创建项目
- 添加必要的起步依赖
- 编写实体类和Repository
- 实现业务服务
- 创建REST控制器
- 配置应用程序属性
- 编写测试
- 打包部署
10.2 推荐的项目结构
plain
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的强大之处在于它的"约定优于配置"理念,让你可以专注于业务逻辑而非基础设施。随着实践的深入,你会越来越体会到它的便利和高效。