1. Spring Boot入门:Spring Boot简介、核心特性、环境准备、快速搭建第一个Spring Boot应用

1.1 为什么我们需要Spring Boot?

说实话,在Spring Boot出现之前,做Java Web开发是一件挺痛苦的事。

我记得2013年那会儿,我刚接手一个老项目。光配置Spring + Spring MVC + MyBatis的整合,就花了整整两天。各种XML配置文件堆在一起,动不动就报ClassNotFoundException。你想想看,一个简单的Hello World,要配web.xml、applicationContext.xml、spring-mvc.xml……光这些文件就够你喝一壶的。

Spring Boot的出现,说白了就是要把我们从这些繁琐的配置中解放出来。它不是一个全新的框架,而是对Spring框架的一次「再封装」。它的核心理念就八个字:约定大于配置,开箱即用

核心观点:Spring Boot让你专注于业务代码,而不是框架配置。它帮你把「该怎么做」变成了「直接做」。

1.2 Spring Boot的核心特性

我挑几个最常用的特性跟你聊聊。这些特性,我在项目中几乎每天都在用。

  • 自动配置(Auto Configuration):Spring Boot会根据你引入的依赖,自动帮你配置好相应的Bean。比如你引入了spring-boot-starter-web,它就自动帮你配好Tomcat和DispatcherServlet。我曾经见过一个新人,自己手动配了一堆东西,结果跟自动配置冲突了,折腾了一下午。嗯,这里要注意:自动配置不是万能的,但它能覆盖90%的场景。
  • 起步依赖(Starter):这是Spring Boot最聪明的设计之一。以前你要用Spring MVC,得自己找一堆依赖包,还得保证版本兼容。现在你只需要引入一个spring-boot-starter-web,它就把所有需要的依赖都给你拉进来了。说白了,就是「一站式购齐」。
  • 内嵌服务器:Spring Boot内嵌了Tomcat、Jetty、Undertow等服务器。你不需要再单独部署WAR包到外部Tomcat了。直接java -jar就能跑起来。我个人习惯用Undertow,性能比Tomcat好一些,而且内存占用更少。
  • Actuator:这是生产环境的「体检中心」。通过它,你可以监控应用的运行状态、查看Bean的加载情况、分析HTTP请求的耗时等等。我在线上排查问题时,经常靠它来快速定位。
特性 解决的问题 我的使用频率
自动配置 减少XML配置 每天
起步依赖 简化依赖管理 每天
内嵌服务器 简化部署 每天
Actuator 生产监控 每周

1.3 环境准备:别在这步翻车

环境准备这块,我踩过不少坑。给你列个清单,照着来就行。

  1. JDK 8+:我建议用JDK 11或17。JDK 8虽然还能用,但很多新特性不支持了。我个人现在用JDK 17,稳定又够新。
  2. Maven 3.6+ 或 Gradle:我个人习惯用Maven,生态更成熟。如果你用Gradle,记得版本别太低。
  3. IDE:IntelliJ IDEA社区版就够用。Eclipse也行,但IDEA对Spring Boot的支持更好。
  4. Spring Initializr:这是官方提供的项目生成工具。你可以在 start.spring.io 上在线生成,也可以在IDEA里直接创建。

避坑指南:我曾经因为JDK版本不匹配,导致Spring Boot项目启动报错。具体来说,Spring Boot 2.x需要JDK 8以上,Spring Boot 3.x需要JDK 17以上。所以,先确认好你要用的Spring Boot版本,再选JDK。

1.4 快速搭建第一个Spring Boot应用

好了,理论说完了,咱们直接上手。我带你搭一个最简单的Web应用。

1.4.1 使用Spring Initializr创建项目

打开 start.spring.io,按以下步骤操作:

  • Project:选择 Maven
  • Language:Java
  • Spring Boot:选择 2.7.x 或 3.x(我建议用2.7.x,稳定)
  • Group:com.example
  • Artifact:demo
  • Dependencies:添加 Spring Web

点击Generate,下载ZIP包,解压后用IDEA打开。

1.4.2 项目结构长什么样?

打开项目后,你会看到这样的结构:

demo/
├── src/
│   ├── main/
│   │   ├── java/com/example/demo/
│   │   │   └── DemoApplication.java
│   │   └── resources/
│   │       ├── application.properties
│   │       ├── static/
│   │       └── templates/
│   └── test/
│       └── java/com/example/demo/
│           └── DemoApplicationTests.java
└── pom.xml

注意看DemoApplication.java,它是整个应用的入口。里面有个main方法,调用了SpringApplication.run()。这就是启动Spring Boot应用的标准姿势。

1.4.3 写一个Hello World接口

在DemoApplication的同级目录下,新建一个HelloController.java:

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot!";
    }
}

代码很简单,就一个GET请求,返回一个字符串。但这里有个细节:@RestController@Controller + @ResponseBody 的组合注解。说白了,它告诉Spring:这个类里的所有方法,返回值直接写进HTTP响应体,不需要走视图解析器。

1.4.4 启动并测试

运行DemoApplication的main方法。控制台会输出类似这样的日志:

Tomcat started on port(s): 8080 (http)
Started DemoApplication in 2.345 seconds (JVM running for 3.123)

打开浏览器,访问 http://localhost:8080/hello,你会看到:

Hello, Spring Boot!

小技巧:如果你想改端口,在application.properties里加一行:server.port=9090。我习惯把端口配在配置文件里,而不是硬编码在代码中。这样换环境时改个配置就行,不用重新编译。

1.5 我的一点心得

第一个Spring Boot应用跑起来后,你可能会觉得:「就这?也太简单了吧。」

没错,Spring Boot的设计目标就是让你觉得简单。但别被这种「简单」迷惑了。真正难的是理解它背后的原理——自动配置是怎么工作的?条件注解是怎么判断的?起步依赖是怎么解决版本冲突的?

我建议你,在跑通第一个应用后,花点时间看看控制台的启动日志。你会发现Spring Boot打印了很多ConditionEvaluationReport信息。这些信息告诉你:哪些自动配置生效了,哪些没生效,为什么没生效。我曾经靠这个日志,排查过一个诡异的Bean加载问题。

好了,第一章就到这里。下一章,我们会深入Spring Boot的自动配置原理,看看它到底是怎么「猜」出你要用什么的。