SpringBoot 2小时入门实战:从零构建可运行Web应用
2026/9/2 8:44:44 网站建设 项目流程

1. 先搞清楚 SpringBoot 到底解决了什么,以及“2小时入门”的真相

如果你刚接触 Java Web 开发,或者被各种繁琐的 Spring 配置搞得头大,那 SpringBoot 就是你现阶段最该投入时间学习的框架。它不是什么全新的技术,而是对 Spring 框架的一种“约定大于配置”的封装,核心目标就一个:让你能快速启动一个可运行的、生产就绪的 Web 应用,把精力从 XML 配置、依赖冲突、服务器部署这些杂事上解放出来,聚焦在业务代码本身。

“2小时入门”这个说法,关键在于定义“入门”。如果你指望 2 小时后就能精通微服务、秒杀系统,那肯定不现实。但如果你目标是:在 2 小时内,从零开始,成功运行一个最简单的 SpringBoot 应用,并理解其核心工作模式,这完全可行。这个“入门”指的是让你跨过“从环境搭建到第一个接口跑通”这个最让人沮丧的门槛,建立最基础的信心和认知框架。后续的数据库操作、事务管理、集成第三方组件,都是在这个稳固的“地基”上添砖加瓦。

很多弯路,其实就绕在第一步。比如在 IDE 里折腾半天项目结构,或者被一个莫名其妙的依赖版本冲突卡住。SpringBoot 通过 Starter 依赖、自动配置和嵌入式服务器(默认是 Tomcat)这三板斧,几乎消灭了这些初期障碍。你接下来要做的,就是跟着一个清晰的路径,亲手把这个“黑盒”打开看一眼。

2. 环境准备:别在起点卡住,JDK、Maven/Gradle、IDE 三件套

动手之前,先把环境理顺。很多“跑不起来”的问题,根源都在这儿。

1. JDK 版本是第一位SpringBoot 3.x 需要 JDK 17 或更高版本;SpringBoot 2.x 通常需要 JDK 8 或 11。对于纯粹的新手,我建议直接从JDK 17 + SpringBoot 3.x开始,这是当前的主流技术栈,能避免学完老版本又得迁移的尴尬。去 Oracle 官网或 Adoptium 下载安装,然后确保命令行执行java -version能正确显示版本。

2. 构建工具选 Maven 还是 Gradle?对于入门,强烈建议先用 Maven。它的pom.xml配置文件结构清晰,网上资料也最全。SpringBoot 官网生成的初始项目也默认提供 Maven 格式。Gradle 更灵活,但语法对新手可能有点怪。先确保 Maven 安装并配置好国内镜像(比如阿里云镜像),否则下载依赖会慢到怀疑人生。在~/.m2/settings.xml中配置镜像源是第一步就该做的事。

3. IDE 就用 IntelliJ IDEA Community 版别犹豫,对于 Java 开发,IDEA 的体验是最好的。社区版免费,对 SpringBoot 的支持已经足够强大。Eclipse 当然也能用,但 IDEA 在智能提示、Spring 配置支持和一键运行方面的优势太明显。用 IDEA 创建 SpringBoot 项目,能帮你自动处理很多初始配置。

注意:不要在这个阶段追求“最新”。比如非要尝试 JDK 21 或 SpringBoot 的最新快照版。锁定一个稳定的、资料多的组合(JDK 17 + SpringBoot 3.2.x),能避开很多未知的兼容性坑。

3. 创建第一个项目:从 IDEA 向导到“Hello World”

理论说再多,不如跑一行代码。我们通过 IDEA 来创建,这是最直观的方式。

3.1 通过 Spring Initializr 创建项目

  1. 打开 IDEA,选择 “New Project”。
  2. 左侧选择 “Spring Initializr”。它会连接官方的项目生成服务。
  3. Project SDK选择你安装的 JDK 17。
  4. 填写项目元数据
    • Group:通常用公司域名倒写,如com.example
    • Artifact:你的项目名,如demo
    • 这里最关键的是Type选 Maven,Language选 Java,Packaging选 Jar。SpringBoot 推荐打成可执行 Jar,内置了 Tomcat。
    • Java Version选 17。
  5. 选择依赖:这是 SpringBoot 精髓。我们只选最核心的:
    • Spring Web:包含了构建 Web 应用(包括 RESTful API)所需的依赖(如 Spring MVC, Tomcat)。
    • Spring Boot DevTools:开发工具,支持热重启,提升开发效率。
    • 其他如Lombok(简化JavaBean编写)可以先不选,保持纯粹。
  6. 点击 Next,选择项目存放位置,然后 Finish。

IDEA 会自动下载初始项目骨架。完成后,你会看到一个标准的 Maven 项目结构,其中src/main/java下有一个以你Artifact命名的包,里面有一个*Application类,类上有个@SpringBootApplication注解。这个类就是整个应用的入口。

3.2 编写第一个 REST 接口

  1. com.example.demo包下(或新建一个controller包),新建一个 Java 类,叫HelloController
  2. 输入以下代码:
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController // 标记这个类是一个控制器,并且返回的是数据(如JSON),不是视图名 public class HelloController { @GetMapping("/hello") // 处理 GET 请求,路径是 /hello public String sayHello() { return "Hello, SpringBoot!"; } }

3.3 运行并验证

  1. 回到那个*Application类(例如DemoApplication),直接运行它的main方法。
  2. 控制台会开始刷日志。当你看到类似Tomcat started on port(s): 8080Started DemoApplication in x.xxx seconds的日志时,说明启动成功了。
  3. 打开浏览器,访问http://localhost:8080/hello
  4. 如果页面上显示Hello, SpringBoot!,恭喜你,你的第一个 SpringBoot 应用已经跑起来了!

这个过程看似简单,但意义重大:你没有配置任何 XML,没有手动部署 Tomcat,只是写了一个带注解的类,应用就启动了。这就是 SpringBoot 的“开箱即用”。

4. 理解核心机制:自动配置、Starter 与嵌入式容器

项目跑起来了,我们得知道它为什么能跑。理解下面三点,能解决你未来 80% 的“为什么我的功能不生效”问题。

4.1 自动配置:@SpringBootApplication的秘密你入口类上的@SpringBootApplication是一个组合注解,它包含了:

  • @SpringBootConfiguration:标记这是 SpringBoot 的配置类。
  • @EnableAutoConfiguration开启自动配置的核心。
  • @ComponentScan:自动扫描当前包及其子包下的组件(如@Controller,@Service)。

@EnableAutoConfiguration会根据你引入的Starter 依赖,自动推断并配置你需要的 Bean。比如你引入了spring-boot-starter-web,SpringBoot 就会自动配置一个嵌入式的 Tomcat 服务器、一个DispatcherServlet(Spring MVC 核心)、默认的 JSON 转换器等。你不需要写一堆@Bean配置。

4.2 Starter 依赖:一站式功能包Starter 是一组预定义好的依赖描述。引入一个 Starter,就等于引入了一个功能全家桶。例如spring-boot-starter-web就包含了 Spring MVC、Tomcat、Jackson(JSON处理)等。这解决了传统 Maven 项目中令人头疼的依赖版本冲突问题——SpringBoot 帮我们管理好了这些版本的兼容性。在pom.xml里,它们的版本由spring-boot-starter-parent统一管理。

4.3 嵌入式容器:从 WAR 到可执行 JAR传统 Java Web 应用需要打包成 WAR 文件,部署到独立的 Tomcat 等服务器。SpringBoot 应用打包成一个可执行的 JAR,这个 JAR 里包含了编译后的代码、所有依赖库,以及一个内嵌的 Web 服务器(默认 Tomcat)。你直接用java -jar yourapp.jar就能启动一个完整的 Web 服务。这极大地简化了部署和运维。

5. 连接数据库:用 Spring Data JPA 实现增删改查

Web 应用离不开数据持久化。我们用 Spring Data JPA 来操作数据库,这是 SpringBoot 生态下非常高效的方式。

5.1 添加依赖与配置

  1. 打开pom.xml,在<dependencies>节点内添加两个依赖:
    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> <!-- 运行时才需要 --> </dependency>
    如果你用 PostgreSQL,就换对应的驱动。
  2. 配置数据库连接。打开src/main/resources/application.properties文件(或application.yml),添加:
    spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
    • ddl-auto=update:启动时根据实体类自动更新表结构(仅用于开发,生产环境慎用或设为none)。
    • show-sql=true:在控制台打印执行的 SQL,方便调试。

5.2 创建实体类与仓库接口

  1. 创建一个实体类,例如User,对应数据库中的user表。
    package com.example.demo.entity; import jakarta.persistence.*; import java.time.LocalDateTime; @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; private LocalDateTime createTime; // 省略构造函数、Getter/Setter(可用Lombok的@Data注解简化) }
  2. 创建一个仓库接口,继承JpaRepository这是最神奇的地方,你不需要写实现。
    package com.example.demo.repository; import com.example.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface UserRepository extends JpaRepository<User, Long> { // 可以根据方法名自动生成查询 List<User> findByUsername(String username); List<User> findByEmailContaining(String keyword); }
    Spring Data JPA 会根据方法名(如findByUsername)自动生成对应的 SQL 实现。

5.3 在 Controller 中调用修改或新建一个UserController

package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.List; @RestController @RequestMapping("/api/users") public class UserController { @Autowired private UserRepository userRepository; @PostMapping public User createUser(@RequestBody User user) { user.setCreateTime(LocalDateTime.now()); return userRepository.save(user); // 新增 } @GetMapping public List<User> getAllUsers() { return userRepository.findAll(); // 查询所有 } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userRepository.findById(id).orElse(null); // 按ID查询 } // 更新和删除方法类似,调用 save(ID存在则更新)和 deleteById }

重启应用,现在你就拥有了一个具备完整 CRUD 功能的 REST API。通过 Postman 或 curl 测试/api/users的 POST 和 GET 请求,看看数据是否成功存入数据库。

6. 配置文件与多环境:让应用适应不同场景

一个应用需要在开发、测试、生产等不同环境运行,配置(如数据库地址、日志级别)自然也不同。SpringBoot 提供了强大的配置管理能力。

6.1 配置文件优先级SpringBoot 支持application.propertiesapplication.yml(更简洁)两种格式。配置文件可以放在多个位置,优先级从高到低:

  1. 项目根目录下的/config子目录。
  2. 项目根目录。
  3. classpath 下的/config包(即resources/config)。
  4. classpath 根目录(即resources)。

高优先级的配置会覆盖低优先级的配置。这常用于生产环境部署:将包含生产数据库密码的application-prod.properties放在服务器项目根目录的/config下,而代码库中只保留开发配置。

6.2 多环境配置

  1. 主配置文件:application.properties,存放通用配置。
  2. 环境特定配置文件:application-{profile}.properties,如application-dev.properties(开发环境),application-prod.properties(生产环境)。
  3. application.properties中通过spring.profiles.active=dev来激活指定环境的配置。也可以在启动命令中指定:java -jar yourapp.jar --spring.profiles.active=prod

6.3 自定义配置与注入你可以在application.properties中定义自己的配置:

app.name=My SpringBoot Demo app.version=1.0.0

然后通过@Value注解注入到 Bean 中:

@RestController public class AppInfoController { @Value("${app.name}") private String appName; @GetMapping("/appinfo") public String getAppInfo() { return "Application: " + appName; } }

对于更结构化的配置,推荐使用@ConfigurationProperties注解,将配置绑定到一个 Java Bean 上,便于管理和类型安全。

7. 常见问题排查:当代码跑不起来时,先看这里

即使按照步骤来,也可能会遇到问题。别慌,按这个顺序排查,大部分问题都能定位。

7.1 应用启动失败

  • 端口被占用:日志中会出现Port 8080 was already in use。解决方案:修改server.port=8081,或停用占用 8080 端口的进程。
  • 数据库连接失败:检查application.properties中的 URL、用户名、密码是否正确;检查数据库服务是否启动;检查网络是否通畅。
  • 依赖下载失败/版本冲突:检查 Maven 镜像配置;尝试mvn clean compile看具体错误;在 IDEA 中查看 Maven 依赖树,排除冲突的传递依赖。
  • 主类找不到:确保@SpringBootApplication注解的类在顶层包,并且@ComponentScan能扫描到你的 Controller、Service 等组件。通常把它们放在主类所在的包或其子包下。

7.2 接口访问 404

  • Controller 未被扫描:确保 Controller 类在@SpringBootApplication主类所在包或其子包下,或者使用了@ComponentScan指定了包路径。
  • 请求路径或方法不匹配:检查@GetMapping/@PostMapping等注解的路径,以及 HTTP 方法(GET/POST等)是否正确。
  • 未添加@RestController@Controller注解

7.3 数据库操作异常

  • ddl-auto=update不生效:检查实体类的@Entity@Id注解是否正确;检查数据库连接是否成功。
  • JpaRepository方法调用报错:检查方法命名是否符合规范(如findByUsername);复杂的查询考虑使用@Query注解写 JPQL 或原生 SQL。

7.4 打包后运行出错

  • java -jar提示 “没有主清单属性”:说明打包方式不对。确保pom.xml中使用了spring-boot-maven-plugin插件,并且执行的是mvn clean package,打包后的 jar 文件通常位于target目录。
  • 运行时配置不生效:记住,打包进 jar 的application.properties优先级较低。生产环境配置应放在与 jar 同级的/config目录或通过命令行参数--spring.profiles.active=prod指定。

8. 下一步该学什么:从入门到能干活

当你成功运行了第一个包含数据库操作的 SpringBoot 应用后,“入门”阶段就算完成了。接下来,为了能真正开始干活,你需要按顺序攻克以下几个核心主题:

  1. Spring MVC 深入:理解@RequestMapping,@RequestParam,@PathVariable,@RequestBody,@ResponseBody等注解的详细用法,掌握请求/响应处理的全流程。
  2. Service 层与事务管理:将业务逻辑从 Controller 抽离到 Service 层。学习@Service注解和@Transactional事务管理。理解 SpringBoot 中事务默认是自动提交的吗?答案是:在声明式事务(@Transactional)中,默认不是自动提交,它会在方法执行成功后提交,异常时回滚。但如果是单纯的 JPAsave操作,其本身会在事务中执行。
  3. 项目结构分层:形成清晰的controller->service->repository/dao->entity的分层架构。理解各层的职责。
  4. 常用 Starter 集成
    • spring-boot-starter-data-redis:集成 Redis,用于缓存或会话存储。
    • spring-boot-starter-securityspring-boot-starter-oauth2-resource-server:实现认证与授权。
    • spring-boot-starter-validation:进行参数校验(如@NotNull,@Email)。
    • spring-boot-starter-aop:实现面向切面编程,处理日志、监控等。
  5. 单元测试:学习使用spring-boot-starter-test,为你的 Service 和 Controller 编写单元测试和集成测试,这是保证代码质量的关键。
  6. 打包与部署:学习如何将应用打包成 Docker 镜像,或部署到常见的云服务器、容器平台。

学习路径上,切忌贪多求全。围绕一个简单的业务场景(比如一个博客系统的文章增删改查),把上述知识点一个个集成进去,动手实现一遍,远比只看文档和视频有效。遇到问题,优先查看官方文档、Stack Overflow 和项目的 GitHub Issue。SpringBoot 的生态非常成熟,你遇到的绝大多数问题,都已经有人给出过解答。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询