尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

59. 【Java】Spring Boot 入门:第一个 Web 应用

59. 【Java】Spring Boot 入门:第一个 Web 应用 摘要本文是Spring Boot入门实战指南从零开始手把手教你创建第一个Spring Boot应用。文章详细介绍了Spring Boot的核心概念、自动配置机制、起步依赖原理并通过Hello World和用户管理API两个完整示例展示如何快速构建RESTful Web服务。同时涵盖项目结构解析、运行测试方法、JDK 21虚拟线程支持等实用内容帮助Java开发者快速掌握现代Spring Boot开发流程。关键词Spring Boot, Java Web开发, REST API, 自动配置, 起步依赖在上一篇文章中我们学习了 JDBC你知道了如何用 Java 程序连接数据库、执行 SQL、处理结果集。你已经掌握了持久层的基本技能。但是你有没有发现JDBC 的代码写起来有点“笨重”每次都要手动获取连接、创建 PreparedStatement、处理 ResultSet、还要小心翼翼地关闭资源……这些代码和你的业务逻辑混在一起让代码变得臃肿且难以维护。而且如果你要写一个真正的 Web 应用光有 JDBC 是远远不够的。你还需要一个 Web 服务器来处理 HTTP 请求和响应一个路由机制把不同的 URL 映射到不同的处理方法一个依赖注入容器来管理对象之间的依赖关系一套数据绑定机制把 HTTP 参数自动转换成 Java 对象……如果这些都让你从头自己写那工作量太大了。好消息是Java 生态中有一个框架几乎帮你做好了以上所有事情——Spring Boot。今天我们就来学习 Spring Boot——这个让 Java Web 开发变得前所未有的简单的框架。1. 什么是 Spring Boot—— Spring 的“一键启动”版在理解 Spring Boot 之前我们先简单了解一下Spring 框架。Spring 是 Java 企业级开发中最流行的框架。它提供了依赖注入DI、面向切面编程AOP、事务管理、MVC Web 框架等核心功能。可以说Spring 是 Java 后端开发的“基石”。但是传统的 Spring 项目配置相当繁琐。你需要写大量的 XML 配置文件或者 Java 配置类手动声明每个 Bean配置数据源、事务管理器、视图解析器……一个简单的 Web 项目光配置文件就可能上百行。这被称为“XML 地狱”。Spring Boot就是在 Spring 基础上构建的“一键启动”版本。它的核心理念是“约定大于配置”Convention over Configuration——Spring Boot 为你提供了合理的默认配置你只需要关注业务逻辑不需要手动配置大部分基础设施。打个比方Spring 就像是一套高级的“乐高积木”零件很多、功能强大但你需要自己看说明书把它们拼起来。Spring Boot 则是把这些零件提前拼好了一个“基础模型”你拿到手就能用想改什么地方再微调就行了。Spring Boot 的几个核心特点特点说明自动配置根据你添加的依赖自动配置 Spring 和第三方库起步依赖一组预定义的依赖集合一次引入就能获得某个功能的所有依赖内嵌服务器内置 Tomcat、Jetty 等 Web 服务器无需部署 WAR 文件生产就绪提供健康检查、指标监控、外部化配置等生产级功能零代码生成不需要生成代码也不需要 XML 配置2. 准备工作环境与工具在开始写第一个 Spring Boot 应用之前确保你的开发环境已经就绪。JDKSpring Boot 3.x 需要JDK 17 或更高版本。我们一直使用 JDK 21完全满足要求。构建工具Maven 3.8或 Gradle 7.x。我们之前已经学过 Maven就用它。IDEIntelliJ IDEA推荐内置 Spring Initializr 支持。如果你用的是 IDEA 的 Ultimate 版本新建项目时可以直接选择 Spring Boot。社区版也支持但需要手动从 start.spring.io 导入。3. 创建第一个 Spring Boot 项目我们有三种方式创建 Spring Boot 项目。推荐前两种。方式一在 IDEA 中直接创建最推荐打开 IntelliJ IDEA点击New Project。在左侧选择Spring Boot或Spring Initializr。填写项目信息Name项目名称比如demo-springbootGroup比如com.exampleArtifact比如demo-springbootJDK选择 JDK 21点击Next在依赖列表中选择Spring Web。点击CreateIDEA 会自动生成项目并下载所有依赖。方式二通过 Spring Initializr 网站生成访问 https://start.spring.io填写 Group、Artifact、Dependencies勾选 Spring Web。点击Generate下载 ZIP 包。解压后在 IDEA 中选择File → New → Project from Existing Sources导入。方式三手动创建 Maven 项目 添加依赖如果你更习惯手动操作可以创建一个普通的 Maven 项目然后在pom.xml中添加 Spring Boot 的父依赖和起步依赖。4. 项目结构 —— 长什么样Spring Boot 项目生成后你会看到这样的目录结构demo-springboot/ ├── pom.xml ← Maven 配置文件 ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/demo/ │ │ │ └── DemoApplication.java ← 启动类最重要的文件 │ │ └── resources/ │ │ ├── application.properties ← 配置文件可选 │ │ └── static/ ← 静态资源CSS、JS、图片 │ └── test/ │ └── java/ │ └── com/example/demo/ │ └── DemoApplicationTests.java ← 测试类其中最核心的是DemoApplication.java它是整个应用的“入口”。5. 编写第一个 REST API —— Hello World让我们打开DemoApplication.java看看里面的内容packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;SpringBootApplication// ① 标记这是一个 Spring Boot 应用RestController// ② 标记这是一个 REST 控制器publicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);// ③ 启动应用}GetMapping(/hello)// ④ 处理 GET 请求路径为 /hellopublicStringhello(RequestParam(valuename,defaultValueWorld)Stringname){returnString.format(Hello %s!,name);// ⑤ 返回响应}}逐行解读①SpringBootApplication这是一个组合注解它包含了Configuration、EnableAutoConfiguration和ComponentScan。简单说它告诉 Spring Boot“这是一个 Spring Boot 应用请自动配置一切”。②RestController标记这个类是一个 REST 风格的 Web 控制器它的每个方法返回值会直接作为 HTTP 响应体返回而不是跳转到一个页面。③SpringApplication.run(...)启动 Spring Boot 应用。它会启动内嵌的 Tomcat 服务器扫描所有 Bean完成自动配置。④GetMapping(/hello)将hello()方法映射到/hello路径的 GET 请求。⑤RequestParam从 HTTP 请求参数中获取name的值。如果没传默认是World。就这么几行代码我们就有了一个完整的 Web 服务没有配置 web.xml没有配置 Spring 容器没有部署 WAR 文件——全部“开箱即用”。6. 运行与测试在 IDEA 中点击DemoApplication类中的绿色三角形 ▶或者右键 →Run ‘DemoApplication’。你会看到类似这样的启动日志. ____ _ __ _ _ /\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / / |_||___//_/_/_/ :: Spring Boot :: (v3.4.0) 2026-07-01T14:30:45.123Z INFO 12345 --- [main] com.example.demo.DemoApplication ... Tomcat started on port 8080 (http) with context path / Started DemoApplication in 2.5 seconds最后一行提示Tomcat started on port 8080——Spring Boot 内嵌的 Tomcat 服务器已经启动正在监听 8080 端口。打开浏览器访问http://localhost:8080/hello你会看到Hello World!再试试http://localhost:8080/hello?name张三Hello 张三!恭喜你你已经用 Spring Boot 成功构建了一个 Web 服务。7. 自动配置 —— Spring Boot 的“魔法”是什么你可能会好奇我们明明没有配置 Tomcat为什么它能启动我们没有配置 Spring MVC为什么GetMapping能工作这就是 Spring Boot 的自动配置Auto-configuration在起作用。自动配置的核心思想是“开箱即用”。Spring Boot 会根据你项目中的依赖来“猜”你需要什么配置当 Spring Boot 检测到spring-web依赖它会自动配置Spring MVC和内嵌 Tomcat。当它检测到spring-data-jpa依赖它会自动配置数据源和JPA。当它检测到spring-security依赖它会自动配置安全过滤器链。自动配置的背后是条件注解Condition Annotations。Spring Boot 中大量的ConditionalOnClass、ConditionalOnMissingBean等注解会在启动时判断“某个类是否存在”、“某个 Bean 是否已经定义”然后决定是否应用某个自动配置。你可以在application.properties或application.yml中覆盖这些默认配置。比如如果你想修改服务器端口# application.properties server.port9090或者用 YAML 格式# application.ymlserver:port:9090重启应用访问http://localhost:9090/hello就能看到效果。8. Spring Boot 的“起步依赖”在pom.xml中你会看到这样的依赖parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.4.0/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependenciesspring-boot-starter-web就是一个“起步依赖”Starter。它不是一个单一的 JAR而是一个依赖集合——它包含了spring-web和spring-webmvcSpring MVC 框架spring-boot-starter-tomcat内嵌 Tomcatjackson-databindJSON 序列化/反序列化以及其他一些辅助库你只需要引入这一个依赖所有构建 Web 应用所需的核心库就全部到位了。Spring Boot 提供了几十个起步依赖覆盖了绝大多数常见场景Starter用途spring-boot-starter-web构建 Web 应用REST APIspring-boot-starter-data-jpa使用 JPA 访问数据库spring-boot-starter-security集成 Spring Securityspring-boot-starter-test测试JUnit、Mockito 等spring-boot-starter-actuator生产监控健康检查、指标9. 一个更“真实”的 REST API 示例让我们写一个更贴近实际的项目一个简单的“用户管理”REST API。packagecom.example.demo;importjakarta.annotation.PostConstruct;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.*;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ConcurrentHashMap;importjava.util.concurrent.atomic.AtomicLong;SpringBootApplicationRestControllerRequestMapping(/api/users)// ① 所有方法的路由前缀publicclassDemoApplication{// 模拟数据库用 Map 存储用户privatefinalConcurrentHashMapLong,UseruserStorenewConcurrentHashMap();privatefinalAtomicLongidGeneratornewAtomicLong(1);publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}/** 应用启动后自动插入默认数据 */PostConstructpublicvoidinitDefaultUsers(){addUser(Alice,aliceexample.com,28);addUser(Bob,bobexample.com,34);addUser(Charlie,charlieexample.com,22);System.out.println( 默认用户已加载当前共 userStore.size() 条);}/** 辅助方法创建用户并返回 ID */privatelongaddUser(Stringname,Stringemail,intage){longididGenerator.getAndIncrement();UserusernewUser();user.setId(id);user.setName(name);user.setEmail(email);user.setAge(age);userStore.put(id,user);returnid;}// ② GET /api/users —— 获取所有用户GetMappingpublicListUserlistUsers(){returnnewArrayList(userStore.values());}// ③ GET /api/users/{id} —— 根据 ID 获取用户GetMapping(/{id})publicUsergetUser(PathVariableLongid){UseruseruserStore.get(id);if(usernull){thrownewRuntimeException(用户不存在: id);// 实际项目应使用自定义异常}returnuser;}// ④ POST /api/users —— 创建用户PostMappingpublicUsercreateUser(RequestBodyUseruser){longididGenerator.getAndIncrement();user.setId(id);userStore.put(id,user);returnuser;}// ⑤ PUT /api/users/{id} —— 更新用户PutMapping(/{id})publicUserupdateUser(PathVariableLongid,RequestBodyUseruser){if(!userStore.containsKey(id)){thrownewRuntimeException(用户不存在: id);}user.setId(id);userStore.put(id,user);returnuser;}// ⑥ DELETE /api/users/{id} —— 删除用户DeleteMapping(/{id})publicStringdeleteUser(PathVariableLongid){if(userStore.remove(id)null){thrownewRuntimeException(用户不存在: id);}return用户 id 已删除;}// ---- 内部数据类 ----publicstaticclassUser{privateLongid;privateStringname;privateStringemail;privateIntegerage;// getter / setter省略实际用 Lombok 简化publicLonggetId(){returnid;}publicvoidsetId(Longid){this.idid;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.emailemail;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.ageage;}}}代码中用到的注解注解作用RequestMapping(/api/users)类级别的路由前缀GetMapping处理 GET 请求PostMapping处理 POST 请求PutMapping处理 PUT 请求DeleteMapping处理 DELETE 请求PathVariable从 URL 路径中提取参数RequestBody把 HTTP 请求体JSON自动绑定到 Java 对象你可以用curl或 Postman 测试这些接口# 创建用户curl-XPOST http://localhost:8080/api/users\-HContent-Type: application/json\-d{name:张三,email:zhangsanexample.com,age:25}# 获取所有用户curlhttp://localhost:8080/api/users# 获取 ID1 的用户curlhttp://localhost:8080/api/users/1# 更新用户curl-XPUT http://localhost:8080/api/users/1\-HContent-Type: application/json\-d{name:张三丰,email:zhangsanfengexample.com,age:30}# 删除用户curl-XDELETE http://localhost:8080/api/users/1Spring Boot 自动集成了 Jackson会自动把 JSON 请求体转换成 Java 对象也会把 Java 对象自动序列化成 JSON 响应。你完全不需要手动处理 JSON 的序列化和反序列化。10. 关于 JDK 21 与 Spring BootSpring Boot 3.x 对 JDK 21 有完整的支持。在 Spring Boot 3.2 中你还可以开启虚拟线程支持让 Web 应用处理高并发请求的能力大幅提升。在application.yml中只需一行配置spring:threads:virtual:enabled:true开启后Tomcat 处理每个请求的线程池会从“平台线程”切换为“虚拟线程”。在 I/O 密集型的 Web 应用中这可以显著提升吞吐量。11. 今天的总结今天我们迈入了 Spring Boot 的大门Spring Boot 是什么基于 Spring 框架的“一键启动”版本核心理念是“约定大于配置”。核心特性自动配置、起步依赖、内嵌服务器、生产就绪。第一个应用通过 Spring Initializr 创建项目一个类 几行注解就完成了一个 Web 服务。自动配置原理根据 classpath 中的依赖自动配置组件。起步依赖spring-boot-starter-*是一组预定义的依赖集合。REST API 开发RestController、GetMapping、PostMapping、RequestBody、PathVariable等注解。JDK 21 支持Spring Boot 3.x 完全支持 JDK 21且可以开启虚拟线程支持。Spring Boot 让 Java Web 开发从一个“繁琐的配置过程”变成了一件“愉快的事情”。你不再需要花大量时间在配置文件上而是可以专注于写业务逻辑。动手试试在 IDEA 中创建一个 Spring Boot 项目运行DemoApplication在浏览器中访问http://localhost:8080/hello确认服务正常启动。在application.properties或application.yml中把端口改成9090重启应用验证端口变化。在上面的用户管理 API 示例中添加一个GetMapping(/search)方法接收name参数返回名字包含该关键词的用户列表。在 IDEA 中打开pom.xml找到spring-boot-starter-web依赖查看它传递引入了哪些其他的依赖在 IDEA 的 Maven 面板中查看依赖树。挑战结合上一篇文章的 JDBC 知识把用户管理 API 的数据存储从内存 Map 改为 MySQL 数据库提示在pom.xml中添加spring-boot-starter-data-jpa和mysql-connector-j配置数据源创建一个UserRepository接口。下一篇文章我们将从零到一构建一个完整的个人博客项目把 Spring Boot、数据库、模板引擎等知识全部串联起来。我们下一篇见。 获取本系列示例代码请访问 GitCode。
返回列表