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 环境准备:别在这步翻车
环境准备这块,我踩过不少坑。给你列个清单,照着来就行。
- JDK 8+:我建议用JDK 11或17。JDK 8虽然还能用,但很多新特性不支持了。我个人现在用JDK 17,稳定又够新。
- Maven 3.6+ 或 Gradle:我个人习惯用Maven,生态更成熟。如果你用Gradle,记得版本别太低。
- IDE:IntelliJ IDEA社区版就够用。Eclipse也行,但IDEA对Spring Boot的支持更好。
- 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的自动配置原理,看看它到底是怎么「猜」出你要用什么的。