欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 从零开始搭建第一个Spring Boot应用:从入门到精通

从零开始搭建第一个Spring Boot应用:从入门到精通

2025/5/8 8:51:34 来源:https://blog.csdn.net/qq_27756951/article/details/147678189  浏览:    关键词:从零开始搭建第一个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的强大之处在于它的"约定优于配置"理念,让你可以专注于业务逻辑而非基础设施。随着实践的深入,你会越来越体会到它的便利和高效。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词