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工具,通过页面配置各种信息和常用起步依赖,然后下载工程模板。

https://start.spring.io/

图中,页面左侧我们可以选择SpringBoot版本、Java版本、构建工具、填写工程的groupIdartifactId等信息,右侧选择需要的起步依赖,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的迁移,一些依赖的groupIdartifactId可能发生了变化。例如,旧的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()方法执行会完成以下关键步骤:

  1. 创建应用上下文ApplicationContext,启动IoC容器
  2. 从配置文件、环境变量、命令行参数等来源加载配置
  3. 执行自动配置,基于@EnableAutoConfiguration和类路径下的依赖,进行大量的条件化Bean注册
  4. 启动嵌入式Web服务器(对于spring-boot-starter-web),检测到该依赖后,会自动启动默认的Tomcat服务器
  5. 运行CommandLineRunnerApplicationRunner,这些类通常用于在应用完全启动后执行一些自定义逻辑

SpringBoot CLI

SpringBoot CLI是SpringBoot提供的一个命令行工具,主要用于快速原型开发,它允许使用Groovy语言编写SpringBoot应用,特别适合快速实验、原型验证或小型脚本式应用。然而,尽管SpringBoot CLI设计的很有创新性且功能强大,但它在生产级或团队开发中使用率很低,主要原因还是Groovy语言极度冷门,以及IDE配合Spring Initializr工具搭建项目已经足够方便,这里就不过多介绍了。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。