SpringBoot简介和工程搭建
SpringBoot是Spring Framework团队在2013年推出的一款革命性框架,它彻底改变了Java企业级应用的开发方式。SpringBoot能够快速基于Spring生态搭建服务端项目,且能简化基于Spring的应用程序开发,目前也是首选的Java服务端开发框架之一。
随着2022年11月SpringBoot3.0的发布和2023年11月23日的SpringBoot2.7正式停止维护,Spring生态也迈入了新的时代。SpringBoot3基于Spring Framework6构建,要求Java17作为最低版本,并全面支持JakartaEE9+的新命名空间。本系列笔记将基于最新的SpringBoot3.5,介绍SpringBoot的核心特性及用法。
项目主页:https://spring.io/projects/spring-boot
注意:SpringBoot2.7虽已停止维护,但当前仍有相当一部分的生产环境系统采用旧版本,本系列笔记则是基于最新的SpringBoot3.5版本编写的,过时特性已完全移除,如果你仍然使用的是旧版本SpringBoot2.7,笔记中的内容可能并不完全适用(尤其是自定义Starter和Actuator章节),需要仔细甄别核对。
SpringBoot核心特性
SpringBoot有两个最为核心的基础特性:
自动配置:SpringBoot能根据类路径中的依赖(例如检测到HikariCP、Spring Data Redis等)自动应用合理的默认配置,例如引入数据库相关依赖后,它会自动配置数据源、连接池等,我们只需要在application.properties配置文件中覆盖需要的属性即可,而不需要从零手动编写大量配置类。这体现了约定优于配置的理念,能够大幅减少样板代码。
起步依赖:SpringBoot提供了大量Starter(起步依赖),每个起步依赖都是一个预定义的依赖集合。它不仅能拉取功能所需的所有第三方库,还通过父POM的<dependencyManagement>统一管理版本,确保依赖兼容性,尽力避免需要手动处理版本冲突的情况出现。
这两点正是SpringBoot能让开发者开箱即用、快速构建生产级应用的关键原因。
SpringBoot使用场景
在SpringBoot出现之前,搭建一个Spring项目是一件颇为繁琐的事。开发者需要手动引入各种Maven依赖,然后编写大量的XML配置文件来定义模板引擎、缓存、持久层等各个组件的 Spring Bean。即使是经验丰富的开发者,完成这些基础配置往往也需要半个小时以上。更麻烦的是,后续第三方库版本升级时,经常会出现依赖冲突、配置不兼容等问题,维护成本极高。这些与业务逻辑无关的研发“基础设施”维护工作在每次新建工程时重复出现,严重拖慢了开发效率。SpringBoot的诞生正是为了解决这些痛点。它通过自动配置和起步依赖两大核心机制,极大简化了项目搭建和配置过程,让开发者能够将精力集中在业务功能的开发上。
SpringBoot主要适用于Java服务端应用的开发,尤其在以下场景中优势明显:
- 快速构建网站和WebAPI
- 集成SpringCloud开发大型项目中的微服务
相比传统的SSH(Struts2 + Spring + Hibernate)或SSM(Spring + SpringMVC + MyBatis)手动整合方式,SpringBoot提供了更现代、更高效的开发体验。它开箱即用、约定优于配置且生态完善,能够极大降低程序员的心智负担、提升服务端软件开发的生产效率。总而言之,除非你在维护一个遗留的古老项目,或者从事一些非Web服务端方向的应用程序,否则没有理由不选择SpringBoot,它几乎已经成为当前Java服务端开发的实际标准和首选框架。
使用Spring Initializr搭建工程
使用网页版Spring Initializr
SpringBoot工程搭建非常简单,我们可以直接访问官方提供的Spring Initializr工具,通过页面配置各种信息和常用起步依赖,然后下载工程模板。

图中,页面左侧我们可以选择SpringBoot版本、Java版本、构建工具、填写工程的groupId、artifactId等信息,右侧选择需要的起步依赖,Spring Initializr会根据我们的配置信息将基本的工程目录和配置搭建好,生成一个ZIP格式的压缩包。如果我们不小心填错了也没事,下载下来后再手动修改相关配置文件等就行了。
Spring Initializr工具本身也是一个开源项目,Github地址为https://github.com/spring-io/start.spring.io。如果我们需要对其进行定制或寻找旧版本(例如你想搭建SpringBoot2工程),也可以在自己的服务器上搭建Spring Initializr。
使用Eclipse IDE
除了访问网页版的Spring Initializr工具,大部分IDE也都对该功能进行了集成。下图为Eclipse(Spring Tool Suite插件)中创建SpringBoot工程的界面,它的底层其实还是调用Spring Initializr的公共网络服务。

SpringBoot工程目录结构
一个非常典型的中大型SpringBoot工程目录结构通常可能按如下设置。
myproject
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com/example/myproject # 基于包目录
│ │ │ ├── MyprojectApplication.java # 主启动类
│ │ │ ├── controller # 控制器层
│ │ │ ├── service # 业务逻辑层
│ │ │ ├── repository # 数据访问层
│ │ │ ├── entity # 实体类
│ │ │ ├── config # 配置类
│ │ │ ├── dto # 数据传输对象
│ │ │ ├── exception # 自定义异常类
│ │ │ └── util # 工具类
│ │ └── resources
│ │ ├── application.properties # 主配置文件(也可选择YAML格式)
│ │ ├── application-dev.properties # 开发环境配置(多环境)
│ │ ├── application-test.properties # 开发环境配置(多环境)
│ │ ├── application-prod.properties # 生产环境配置(多环境)
│ │ ├── static # 静态资源(非前后端分离项目)
│ │ ├── templates # 模板文件(非前后端分离项目)
│ └── test
│ └── java
│ └── com/example/myproject # 测试类
│ └── MyprojectApplicationTests.java
├── target/ 或 build/ # 构建输出目录
├── pom.xml # Maven配置文件
我们可以看到,其实SpringBoot工程目录遵循标准的Maven工程结构,这个结构也是SpringBoot官方文档和社区推荐的起点,实际项目可根据规模扩展或省略,但保持清晰、分层是项目能健康、可持续迭代的关键。
关于pom.xml
Parent POM
SpringBoot的核心设计理念之一就是“约定优于配置”,我们打开默认创建的pom.xml会看到项目继承了一个特殊的父POM。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.9</version>
<relativePath/>
</parent>
这个父POM提供了统一的依赖管理,其中定义了大量常用第三方库的兼容版本,这意味着你在添加依赖时,通常可以省略<version>标签,父POM会为你选择一个经过测试的、兼容的版本,我们可以查看该文件的内容验证这一点。
spring-boot-maven-plugin
pom.xml中另一个特别值得关注的点是配置的插件,spring-boot-maven-plugin插件用于构建我们的SpringBoot工程为可执行FatJar或War包。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
Starter(起步依赖)
正如前面所说,起步依赖是一组预定义的依赖描述符。例如,当你添加了spring-boot-starter-web起步依赖,实际上就引入了构建一个传统Web应用所需的所有常见依赖:Embedded Tomcat、SpringMVC、Jackson库等。和父POM类似,我们同样可以打开起步依赖的POM验证这一点。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:在SpringBoot3中,由于JavaEE向JakartaEE的迁移,一些依赖的groupId、artifactId可能发生了变化。例如,旧的javax.persistence:javax.persistence-api已被jakarta.persistence:jakarta.persistence-api取代。SpringBoot的起步依赖已经处理了这些变更,你只需要引入正确的Starter即可。
关于主启动类
SpringBoot工程中,核心入口是一个标注了@SpringBootApplication的类,通常命名为*Application(例如DemoSpringbootApplication),其中包含一个Java的main()方法,我们直接运行这个main()方法即可默认在8080端口启动HTTP服务。
package com.gacfox.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoSpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringbootApplication.class, args);
}
}
@SpringBootApplication是一个组合注解,它其实等价于同时使用以下三个注解:
@SpringBootConfiguration:本质上是@Configuration的变体,标记该类是一个Spring配置类@EnableAutoConfiguration:启用SpringBoot的自动配置机制,这是SpringBoot的核心基础特性,它会根据你引入的依赖自动推断并配置SpringBoot应用所需的组件@ComponentScan:自动扫描当前包及其子包下所有标注了@Component、@Service、@Repository、@Controller等Spring注解的类,并将它们注册为Spring Bean
DemoSpringbootApplication类是引导和启动SpringBoot应用的入口,其中的run()方法执行会完成以下关键步骤:
- 创建应用上下文ApplicationContext,启动IoC容器
- 从配置文件、环境变量、命令行参数等来源加载配置
- 执行自动配置,基于
@EnableAutoConfiguration和类路径下的依赖,进行大量的条件化Bean注册 - 启动嵌入式Web服务器(对于
spring-boot-starter-web),检测到该依赖后,会自动启动默认的Tomcat服务器 - 运行
CommandLineRunner或ApplicationRunner,这些类通常用于在应用完全启动后执行一些自定义逻辑
SpringBoot CLI
SpringBoot CLI是SpringBoot提供的一个命令行工具,主要用于快速原型开发,它允许使用Groovy语言编写SpringBoot应用,特别适合快速实验、原型验证或小型脚本式应用。然而,尽管SpringBoot CLI设计的很有创新性且功能强大,但它在生产级或团队开发中使用率很低,主要原因还是Groovy语言极度冷门,以及IDE配合Spring Initializr工具搭建项目已经足够方便,这里就不过多介绍了。