从零开始搭建第一个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父项目:
xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.0</version> <!-- 使用最新版本 -->
</parent>
  1. 添加起步依赖:
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 运行应用并测试

  1. 运行DemoApplication中的main方法
  2. 应用默认启动在8080端口
  3. 使用Postman或浏览器测试:

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(更推荐)

示例配置

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 生产环境建议

  1. 使用spring-boot-starter-actuator添加监控端点
  2. 配置适当的日志级别
  3. 使用application-prod.yml存放生产环境配置
  4. 考虑使用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开发流程总结

  1. 使用Spring Initializr创建项目
  2. 添加必要的起步依赖
  3. 编写实体类和Repository
  4. 实现业务服务
  5. 创建REST控制器
  6. 配置应用程序属性
  7. 编写测试
  8. 打包部署

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的强大之处在于它的"约定优于配置"理念,让你可以专注于业务逻辑而非基础设施。随着实践的深入,你会越来越体会到它的便利和高效。

相关推荐
帝锦_li31 分钟前
Springboot循环依赖
spring boot
软件20538 分钟前
【登录流程图】
java·前端·流程图
深度物联网2 小时前
Spring Boot多模块划分设计
java·spring boot·后端
一 乐2 小时前
宿舍报修|宿舍报修小程序|基于Java微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·宿舍报修小程序
武昌库里写JAVA4 小时前
Java 设计模式
java·vue.js·spring boot·课程设计·宠物管理
钢铁男儿4 小时前
Python 函数装饰器和闭包(闭包)
java·网络·python
东坡大表哥4 小时前
【Android】Android签名解析
android·java
杨不易呀5 小时前
Java面试:微服务与大数据场景下的技术挑战
java·大数据·微服务·面试·技术栈
magic 2455 小时前
SpringMVC——第三章:获取请求数据
java·数据库·springmvc