SpringBoot快速入门:从项目创建到RESTful API实战详解

发布时间:2026/11/1 23:05:05

SpringBoot快速入门:从项目创建到RESTful API实战详解 1. 项目概述为什么SpringBoot是Java开发的“瑞士军刀”如果你刚接触Java后端开发或者是从传统的Spring MVC项目转过来第一次听说SpringBoot可能会有点懵。Spring框架本身已经够复杂了怎么又冒出来一个Boot简单来说你可以把SpringBoot理解为Spring框架的“懒人包”或者“快速启动器”。它不是为了取代Spring而是为了让Spring应用的创建、配置和部署变得前所未有的简单。回想一下以前搭建一个Spring Web项目你得手动配置web.xml配置DispatcherServlet配置一堆XML文件来声明Bean处理各种依赖冲突最后还得费劲地把它部署到一个外部的Tomcat服务器上。这个过程繁琐、容易出错而且对新手极不友好。SpringBoot的核心设计哲学就是“约定大于配置”。它预先设定好了一套默认的、合理的配置你只需要专注于写业务代码那些繁琐的、重复的配置工作SpringBoot都帮你自动搞定了。比如内嵌了Tomcat、Jetty或Undertow服务器你打出来的jar包直接java -jar就能运行提供了海量的“Starter”依赖引入一个starter相关的依赖和默认配置就全齐了还有强大的自动配置机制能根据你引入的jar包自动判断并配置你的应用。所以这个“快速入门-02”的目标就是带你越过“Hello World”的简单演示深入到SpringBoot项目的基础结构和核心配置中。我们会从创建一个标准的SpringBoot项目开始一步步拆解它的目录结构、核心配置文件并动手实现一个简单的RESTful API。这不是一个照本宣科的教程而是结合了我自己从早期手动搭建Spring项目到拥抱SpringBoot后效率倍增的真实体验告诉你每个步骤背后的“为什么”以及新手最容易踩的坑在哪里。2. 项目创建与环境搭建从IDE开始就选对工具工欲善其事必先利其器。创建SpringBoot项目首推IntelliJ IDEA以下简称IDEA的Ultimate版本。社区版虽然免费但对SpringBoot的原生支持不够完善。如果你暂时没有条件也可以使用Spring官方提供的在线生成器 start.spring.io 生成项目后再用任何IDE打开。2.1 使用IDEA创建项目的核心细节打开IDEA选择“New Project”在左侧找到“Spring Initializr”。这里有几个关键选项需要你理解Project SDK确保选择了你本地安装的JDK 8或以上版本推荐JDK 11或17这是目前的主流长期支持版本。Service URL默认是官方的https://start.spring.io保持不动即可。它背后就是一个项目生成服务。Project Metadata这是项目的“身份证”。Group通常使用公司或组织的域名倒写例如com.example。它决定了你生成的Java包的基础路径。Artifact你的项目名称例如demo。这会成为项目文件夹名和最终构建产物jar包名称的一部分。Type选择Maven。虽然Gradle也很流行且更灵活但对于初学者Maven的XML配置方式更直观生态和资料也更丰富。我们本篇以Maven为例。Language选择Java。Packaging选择Jar。这是SpringBoot的推荐方式因为内嵌了服务器打成可执行的Jar包部署最方便。Java Version选择与你JDK对应的版本如11或17。注意Group和Artifact共同决定了你的项目主类默认所在的包。例如Groupcom.example,Artifactdemo那么你的启动类通常会在com.example.demo包下。一开始就规划好避免后续移动包带来的麻烦。接下来点击“Next”进入选择依赖的界面。这是SpringBoot最精髓的部分之一——Starter。2.2 依赖选择理解Starter的力量在这里你可以搜索并添加项目需要的依赖。对于我们的快速入门至少需要Spring Web提供构建Web应用的能力包括RESTful API、内嵌Tomcat等。Spring Boot DevTools开发工具提供热重启功能。修改代码后保存应用会自动重启比完全重启快得多极大提升开发效率。Lombok一个Java库通过注解自动生成getter、setter、构造函数等样板代码让代码更简洁。这是一个强烈推荐的开发期依赖。搜索并勾选它们然后点击“Create”。IDEA会自动从网络下载项目模板和初始依赖这个过程取决于你的网速。实操心得不要在一开始就引入大量不必要的Starter。遵循“按需引入”原则。比如你现在不确定会不会用数据库就不要勾选Spring Data JPA或MyBatis Framework。等确实需要时再回到pom.xml文件中手动添加依赖即可。依赖过多会增加应用启动时间和潜在冲突。创建完成后你会得到一个标准的SpringBoot项目结构。我们先不急着写代码花几分钟彻底理解这个结构能帮你省去后面无数找文件的麻烦。3. 项目结构深度解析每个文件夹的使命一个典型的SpringBoot项目结构如下基于Mavendemo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── demo/ │ │ │ └── DemoApplication.java # 项目主启动类 │ │ └── resources/ │ │ ├── static/ # 存放静态资源CSS, JS, 图片 │ │ ├── templates/ # 存放模板文件Thymeleaf, FreeMarker │ │ └── application.properties # 主配置文件 │ └── test/ # 测试代码目录 │ └── java/ │ └── com/.../demo/ # 测试类存放处 └── pom.xml # Maven项目对象模型管理依赖和构建src/main/java这是你编写所有Java业务逻辑代码的地方。包结构通常按功能或层级划分例如controller,service,repository,entity等。src/main/resources资源文件目录。static放前端静态资源。当浏览器访问/index.html时SpringBoot会默认在这里查找。templates放服务端渲染的模板。如果你用Thymeleaf.html文件就放这里。application.properties这是SpringBoot的核心配置文件。所有自定义的配置几乎都写在这里。比如服务器端口、数据库连接、日志级别等。它还有一种YAML格式的兄弟application.yml语法更简洁但注意缩进必须严格。src/test存放单元测试和集成测试代码。SpringBoot强烈鼓励测试并提供了SpringBootTest等强大的测试注解。pom.xml项目的“心脏”。它定义了项目信息、依赖关系、构建插件等。打开它你会看到SpringBoot的父依赖spring-boot-starter-parent以及我们刚才选的spring-boot-starter-web等。3.1 解剖启动类SpringBootApplication的秘密我们重点看下自动生成的DemoApplication.javapackage com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }这个类极其简短但内涵丰富。关键就在于SpringBootApplication这个注解。它不是一个普通的注解而是一个“复合注解”相当于同时标明了以下三个注解SpringBootConfiguration表明这个类是一个Spring Boot的配置类。它继承自Configuration意味着你可以在这里定义Bean用Bean注解。EnableAutoConfiguration这是SpringBoot自动配置的“开关”。加上这个注解SpringBoot就会启动它的自动配置机制根据你引入的jar包依赖自动为你配置Spring应用。比如你引入了spring-boot-starter-web它就会自动配置内嵌的Tomcat和Spring MVC的基本环境。ComponentScan告诉Spring从当前类所在的包com.example.demo开始递归扫描其所有子包寻找那些被Component,Service,Repository,Controller等注解标记的类并把它们自动注册为Spring容器管理的Bean。main方法里的SpringApplication.run()则是启动整个Spring应用的入口。你可以直接运行这个类的main方法一个内嵌了Web服务器的应用就启动了默认端口是8080。注意事项ComponentScan的默认扫描起点是标注该注解的类所在的包。因此强烈建议将你的主启动类放在项目包结构的最顶层例如com.example.demo而将controller、service等放在它的子包下如com.example.demo.controller。这样能确保所有组件都被扫描到。如果你把启动类放在一个很深的包里可能会导致其他组件扫描不到从而出现“404”或“Bean找不到”的错误。4. 核心配置实战application.properties vs application.yml配置文件是连接代码和运行环境的桥梁。SpringBoot支持两种格式.properties和.yml。.properties是传统的键值对而.yml采用缩进表示层级更清晰。application.properties 示例# 服务器配置 server.port9090 # 修改默认端口为9090 server.servlet.context-path/api # 为所有请求路径添加前缀 /api # 日志配置 logging.level.com.example.demoDEBUG # 设置特定包的日志级别为DEBUG logging.file.namemyapp.log # 将日志输出到文件myapp.log # 自定义配置 myapp.nameSpringBoot Quick Start myapp.version1.0等价的 application.yml 示例server: port: 9090 servlet: context-path: /api logging: level: com.example.demo: DEBUG file: name: myapp.log myapp: name: SpringBoot Quick Start version: 1.0YAML的层次结构一目了然但必须注意缩进并且只能用空格不能用Tab键这是很多新手容易出错的地方。如何在代码中读取这些配置呢SpringBoot提供了多种方式Value注解适用于注入单个值。RestController public class MyController { Value(${myapp.name}) private String appName; GetMapping(/info) public String info() { return App Name: appName; } }ConfigurationProperties注解适用于将一组配置绑定到一个Java Bean上这是更推荐的方式特别是配置项很多的时候。Component ConfigurationProperties(prefix myapp) // 绑定前缀为myapp的配置 Data // Lombok注解自动生成getter/setter public class MyAppProperties { private String name; private String version; // 标准的getter和setter (由Lombok生成) }然后在需要的地方注入MyAppPropertiesBean即可使用。避坑技巧在application.properties中配置项的名字是松散绑定的。这意味着server.port、serverPort甚至SERVER_PORT在配置文件中都可能被识别虽然不推荐后两种。但在使用ConfigurationProperties绑定到Bean的字段时字段名通常使用小写驼峰如contextPath来匹配server.servlet.context-path。5. 第一个RESTful API从Controller到浏览器理论说得再多不如动手写一行代码。我们来创建一个最简单的RESTful API在浏览器里返回一个“Hello, SpringBoot!”。5.1 创建Controller在src/main/java/com/example/demo下新建一个包controller然后在里面创建类HelloController.java。package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController // 1. 声明这是一个REST风格的控制器返回值直接写入HTTP响应体 RequestMapping(/api/hello) // 2. 定义这个控制器下所有方法的请求路径前缀 public class HelloController { GetMapping // 3. 处理HTTP GET请求路径为 /api/hello public String sayHello() { return Hello, SpringBoot!; } GetMapping(/{name}) // 4. 处理 GET /api/hello/{name}{name}是路径变量 public String sayHelloToSomeone(PathVariable String name) { return Hello, name !; } }代码解析RestControllerControllerResponseBody。它告诉Spring这个类的所有方法返回的数据都直接写入HTTP响应体而不是跳转到一个视图模板。RequestMapping定义了类级别的请求映射前缀。这样这个类里所有方法的实际路径都会加上/api/hello。GetMapping是RequestMapping(method RequestMethod.GET)的简写专门处理GET请求。GetMapping(/{name})定义了一个带路径变量的URL。{name}是一个占位符PathVariable注解将URL中的值绑定到方法参数name上。5.2 运行与测试回到你的主启动类DemoApplication直接运行它的main方法。在IDEA的控制台你会看到SpringBoot的启动日志最后出现类似“Tomcat started on port(s): 8080 (http)”的字样说明启动成功了。打开你的浏览器访问http://localhost:8080/api/hello- 你会看到 “Hello, SpringBoot!”http://localhost:8080/api/hello/World- 你会看到 “Hello, World!”恭喜你你的第一个SpringBoot API已经成功运行了整个过程没有配置任何XML没有部署Tomcat就是写了一个Java类运行了一个main方法。6. 自动配置原理浅析SpringBoot的“魔法”是如何工作的你可能会有疑问我什么都没配置Tomcat怎么启动的Spring MVC的组件如DispatcherServlet怎么注册的这就是EnableAutoConfiguration和“自动配置类”在起作用。SpringBoot的自动配置其实并不神秘。当你引入spring-boot-starter-web时它背后依赖了一系列jar包包括Spring MVC、Tomcat等。在这些jar包的META-INF/spring.factories文件里新版本在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中声明了许多“自动配置类”例如ServletWebServerFactoryAutoConfiguration,DispatcherServletAutoConfiguration等。SpringBoot启动时会加载这些自动配置类。每个自动配置类都使用Conditional系列注解如ConditionalOnClass,ConditionalOnMissingBean进行条件判断。以Tomcat为例Configuration(proxyBeanMethods false) ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class }) // 条件1类路径下有Tomcat相关的类 ConditionalOnMissingBean(value ServletWebServerFactory.class, search SearchStrategy.CURRENT) // 条件2用户自己没有定义ServletWebServerFactory这个Bean public class ServletWebServerFactoryAutoConfiguration { // 这个配置类会导入内嵌Tomcat的配置 }翻译过来就是如果类路径下存在Tomcat相关的类并且用户自己没有提供ServletWebServerFactory的实现那么SpringBoot就自动帮你配置一个内嵌的Tomcat服务器。这也就是为什么我们说SpringBoot是“约定大于配置”。它预先定义好了一套默认的、合理的配置只要你的行为符合它的“约定”比如引入了某个starter它就自动生效。如果你不满意随时可以用你自己的配置比如在application.properties中修改端口或者自己定义一个Bean来覆盖这些默认配置。这种机制在提供极大便利的同时也保留了充分的灵活性。7. 开发效率利器DevTools与Lombok在第二部分创建项目时我们引入了两个提升开发效率的依赖现在来详细看看它们怎么用。7.1 Spring Boot DevTools实现热重启传统Java Web开发修改一点代码就要重启整个应用等待时间很长。DevTools提供了“热重启”功能。它的原理是使用两个独立的类加载器一个加载那些不会变的第三方库Base ClassLoader另一个加载你正在开发的代码Restart ClassLoader。当你修改代码并保存后DevTools只会重启第二个类加载器速度非常快。如何使用引入依赖后默认就启用了。你修改Java代码、配置文件、静态资源等保存后IDEA会自动编译然后你会看到控制台有“Reloading...”的日志应用就重启好了。注意它并不是像前端Hot Module Replacement那样无需刷新页面而是重启了应用所以HTTP会话等会丢失但比重启整个JVM快得多。常见问题不生效检查IDEA的自动编译是否开启 (Settings - Build, Execution, Deployment - Compiler勾选Build project automatically)。同时需要按CtrlShiftAlt/选择Registry勾选compiler.automake.allow.when.app.running。想排除某些资源不触发重启可以在application.properties中配置spring.devtools.restart.excludestatic/**,public/**。7.2 Lombok告别冗余的Getter/SetterJava的POJO类尤其是Entity、DTO经常需要一堆getter、setter、toString、equals/hashCode方法代码非常冗长。Lombok通过在编译时使用注解处理器来为你自动生成这些代码。常用注解Data一个复合注解相当于GetterSetterToStringEqualsAndHashCodeRequiredArgsConstructor。在简单的POJO上用一个Data就全搞定了。Getter/Setter只为字段生成getter/setter。NoArgsConstructor生成无参构造器。AllArgsConstructor生成全参构造器。Slf4j在类上使用会自动注入一个日志对象log你可以直接使用log.info(...)无需再写private static final Logger log LoggerFactory.getLogger(...);。示例Data // 自动生成所有字段的getter/setter, toString, equals, hashCode AllArgsConstructor // 生成全参构造器 NoArgsConstructor // 生成无参构造器 public class User { private Long id; private String username; private String email; }这样你就拥有了一个功能完整的User类而代码极其简洁。重要提示Lombok需要在你的IDE中安装插件才能正常识别注解并给出代码提示。在IDEA中去插件市场搜索“Lombok”并安装。同时确保项目的编译器中启用了注解处理 (Settings - Build, Execution, Deployment - Compiler - Annotation Processors勾选Enable annotation processing)。8. 打包与部署从开发到生产的一步之遥开发完成后我们需要将应用部署到服务器。SpringBoot的打包部署简单得令人发指。8.1 使用Maven打包在项目根目录有pom.xml的目录下打开命令行执行mvn clean packageMaven会执行清理、编译、测试、打包等一系列操作。最终在target目录下你会找到两个jar包demo-0.0.1-SNAPSHOT.jar这是普通的jar包只包含你编译的类文件。demo-0.0.1-SNAPSHOT.jar.original这是可执行的“fat jar”或“uber jar”。它包含了你的所有代码、依赖的第三方库以及内嵌的Tomcat服务器。我们要用的就是这个文件。8.2 运行与部署将上一步生成的demo-0.0.1-SNAPSHOT.jar文件上传到你的Linux服务器。只需要Java运行环境无需安装Tomcat。在服务器上运行java -jar demo-0.0.1-SNAPSHOT.jar应用就会启动监听你在application.properties中配置的端口默认8080。你可以使用nohup命令让它在后台运行nohup java -jar demo-0.0.1-SNAPSHOT.jar app.log 21 这样应用日志会输出到app.log文件即使你关闭终端应用也会继续运行。8.3 自定义启动参数你可以在启动时覆盖配置文件中的属性这在生产环境非常有用。例如你想用外部的配置文件或者动态指定端口java -jar demo-0.0.1-SNAPSHOT.jar --server.port9090 --spring.config.locationfile:/path/to/application-prod.properties通过--后面跟上配置项就可以在命令行中指定任何配置优先级高于打包在jar内的application.properties。生产环境注意事项配置文件分离不要把生产环境的数据库密码等敏感信息写在打包进jar的application.properties里。应该使用spring.config.location指定外部的配置文件或者使用环境变量如SPRING_DATASOURCE_PASSWORD来覆盖。激活ProfileSpringBoot支持多环境配置。你可以创建application-dev.properties开发环境、application-prod.properties生产环境。在启动时通过--spring.profiles.activeprod来激活生产环境配置。健康检查与管理端点Spring Boot Actuator提供了丰富的应用监控和管理端点如/actuator/health健康检查/actuator/metrics指标。在生产环境引入时务必通过management.endpoints.web.exposure.include和management.endpoints.web.exposure.exclude来严格控制哪些端点可以暴露并设置安全访问。
延伸阅读

更多相关文章

2026/10/25 8:24:14

有哪些用户行为分析平台?2026年用户数据驱动运营方案盘点

2026年,中国生成式AI用户规模已突破5.5亿,小程序电商用户中女性占比超七成、中青年群体占近六成。用户行为分析早已不是锦上添花的工具,而是企业数据驱动运营的中枢神经。面对纷繁的平台选项,决策者的困惑高度集中:用户…

2026/11/1 11:45:12

MT磁性数据快速分析程序-更新

这是一个非常实用的HTML文件,可以脱离复杂的构建环境直接在任何浏览器中双击运行。请将以下代码保存为 MagneticAnalyzer.html,然后双击在浏览器中打开即可:使用时请查看左侧专门的「数据格式与使用说明」面板及输入数据的格式(用…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑