你电脑里还没有一个像样的SpringBoot项目今天就来手把手搭一个别急着去搜“Spring Boot 入门”也别打开IDE对着空白项目发呆。如果你已经折腾过几次但总卡在某个环节——比如依赖冲突、配置不生效、热部署怎么都不工作——那这篇就是为你准备的。我们会从空文件夹开始一步步构建一个真正可运行的SpringBoot项目同时把那些“官方文档说得很简单但实际操作总翻车”的细节统统掰开揉碎。真正的高效开发不是靠背步骤而是理解每一步背后的“为什么”。当你明白了SpringBoot为什么会自动配置为什么会扫描这个包而不是那个包你才能在报错时一眼看出问题所在。第一步环境准备——你不是在装软件是在搭地基很多人上来就打开IDEA点新建项目结果发现JDK版本不对、Maven下载依赖超时、Gradle构建报错——然后卡半小时。环境的统一是团队协作的起点也是你个人项目不出幺蛾子的保障。你需要准备JDK 17推荐SpringBoot 3.x 强制要求JDK 17但如果你仍用2.xJDK 8也可以Maven 3.8 或 Gradle 7这里以Maven为例IDEIntelliJ IDEACommunity版足够或者VSCode 插件有一个极易踩坑的点PATH里的JDK版本一定要和IDEA里使用的JDK版本一致。你可以在终端执行java -version和mvn -v查看如果IDEA里指定了JDK 17但系统PATH里是JDK 11Maven编译时就会报错。解决方案是统一环境变量或者在IDEA的 Settings → Build, Execution, Deployment → Build Tools → Maven → Runner 里指定JRE路径。还有一个技巧配置Maven的settings.xml加上阿里云镜像否则你第一次下载依赖可能要等10分钟。在~/.m2/settings.xmlWindows在C:\Users\你的用户名\.m2中添加mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror第二步创建项目——不要再手动建包了用Initializr我知道有些人喜欢在IDEA里直接New Project选Spring Initializr然后下一步下一步。但如果你想要完全掌控项目结构或者你的网络无法访问start.spring.io那就手动创建项目——其实就三步。第一步创建一个空目录里面放一个pom.xml。打开这个文件写入最简内容?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent groupIdcom.example/groupId artifactIddemo/artifactId version0.0.1-SNAPSHOT/version namedemo/name descriptionDemo project for Spring Boot/description properties java.version17/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project这里最关键的父依赖是spring-boot-starter-parent它帮你管理了所有官方starter的版本号你不需要再为版本冲突烦恼。当然如果你在公司里不能用parent比如已有自己的parent可以改用依赖管理方式但新手阶段只用parent最简单。接下来创建目录结构src/main/java/com/example/demo和src/main/resources。在主目录下放一个启动类package 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是一个组合注解它包含了Configuration、EnableAutoConfiguration和ComponentScan。如果你将来需要排除某些自动配置可以在它上面加exclude属性。现在在pom.xml目录下打开终端执行mvn spring-boot:run如果看到Spring的Logo和端口号恭喜你第一个SpringBoot应用跑起来了。第三步编写一个REST接口——验证你的项目是否能真正工作有一个最小可行端点比任何配置都更能确认项目状态。在com.example.demo包下新建controller子包然后创建package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { GetMapping(/hello) public String hello() { return Hello Spring Boot!; } }重启应用访问http://localhost:8080/hello你应该看到“Hello Spring Boot!”。如果访问404检查包结构HelloController必须在DemoApplication所在包或其子包下否则ComponentScan扫不到。这是新手最容易忽略的问题——把Controller放到了别的位置。假设你想自定义端口可以在src/main/resources/application.properties里写server.port8888然后重启。配置文件是整个应用的神经中枢你可以在里面配置数据源、Redis、日志级别等等。第四步配置管理的艺术——用YAML和Profile来区分环境SpringBoot支持多种配置格式推荐使用YAML因为它层级清晰并且支持多文档块。把application.properties改成application.yml写入server: port: 8080 spring: application: name: demo-service如果要区分开发和生产环境创建application-dev.yml和application-prod.yml。在application.yml里指定激活哪个spring: profiles: active: dev启动时也可以通过参数覆盖java -jar demo.jar --spring.profiles.activeprod一个更优雅的方式是使用Profile注解为不同环境提供不同的Bean。比如开发环境用嵌入式H2数据库生产环境用MySQL你只需要写两个数据源配置类加上Profile(dev)和Profile(prod)即可。还有一个常用技巧在配置文件中使用随机端口。如果你在本地同时跑多个微服务可以设置server.port${random.int(8000,9000)}避免端口冲突。但正式环境中一定要写固定端口或通过环境变量注入。第五步热部署——别再手动重启了你的时间很宝贵每次修改代码都要手动CtrlC再启动这会严重打断心流。SpringBoot提供spring-boot-devtools可以实现自动重启只重启应用不重启JVM非常快。在pom.xml添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency然后在IDEA里打开自动编译Settings → Build, Execution, Deployment → Compiler勾选“Build project automatically”。同时按住CtrlShiftA搜索“Registry”勾选compiler.automake.allow.when.app.running。注意devtools 的自动重启只监控 classpath 中的文件变更。如果你修改了模板文件如Thymeleaf可能需要额外配置spring.devtools.restart.additional-paths。另外生产环境中千万别带这个依赖。还有一个调试技巧使用LiveReload。如果你在浏览器中开发前后端结合的项目安装LiveReload插件SpringBoot会主动通知浏览器刷新。你只需要在application.yml里确保spring.devtools.livereload.enabledtrue默认就是true。第六步集成数据库——从H2到MySQL一步到位大部分真实项目都需要持久化。开发阶段用H2内存数据库可以极快启动而不用安装任何数据库服务。在pom.xml加上dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.h2database/groupId artifactIdh2/artifactId scoperuntime/scope /dependency然后在application-dev.yml里spring: datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true jpa: hibernate: ddl-auto: create-drop show-sql: true启动后访问http://localhost:8080/h2-console输入JDBC URLjdbc:h2:mem:testdb就可以看到数据库。这是开发期间调试SQL的利器。如果要切换到MySQL同样简单在application-prod.yml里spring: datasource: url: jdbc:mysql://localhost:3306/demo?useSSLfalseserverTimezoneUTCallowPublicKeyRetrievaltrue username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: false一个非常重要的细节ddl-auto在开发阶段可以用update或create-drop但生产环境要改为none或validate否则一不小心就会把表结构改掉。推荐用validate配合专门的迁移工具如Flyway、Liquibase来管理数据库版本。第七步日志系统——别等出BUG了才想起看日志SpringBoot默认使用Logback并且已经帮你配置了简单的控制台输出。但如果你需要输出到文件、按天滚动、区分日志级别就得手动配一个logback-spring.xml。在src/main/resources下创建?xml version1.0 encodingUTF-8? configuration include resourceorg/springframework/boot/logging/logback/base.xml/ springProperty scopecontext nameAPP_NAME sourcespring.application.name/ property nameLOG_PATH value${LOG_PATH:-./logs}/ appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${APP_NAME}.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log/fileNamePattern maxHistory30/maxHistory totalSizeCap3GB/totalSizeCap timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender root levelINFO appender-ref refFILE/ appender-ref refCONSOLE/ /root /configurationspringProperty可以从application.yml读取变量比如spring.application.name这样每个微服务可以自动使用自己的服务名作为日志文件名。记得在application.yml里加上spring.application.name配置。日志格式建议包含线程名和调用者排查问题时能快速定位到具体代码行。千万不要只打印logger.info(xxx)而不加上下文信息否则你根本不知道是哪个请求出的问题。第八步单元测试与集成测试——让你敢重构的护身符很多人写完代码从来不写测试结果一改代码就崩。SpringBoot对测试的支持非常强大你只需要加入spring-boot-starter-test默认已经引入然后就可以用SpringBootTest加载完整上下文。创建一个测试类package com.example.demo; import com.example.demo.controller.HelloController; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import static org.assertj.core.api.Assertions.assertThat; SpringBootTest class DemoApplicationTests { Autowired private HelloController controller; Test void contextLoads() { assertThat(controller).isNotNull(); } }SpringBootTest会启动整个Spring应用上下文适合做集成测试。如果你只想测试特定层比如只测试Controller可以用WebMvcTest只测试Repository用DataJpaTest。这样可以大幅减少启动时间。还有一个常见技巧用MockBean模拟外部依赖。比如你的Service调用了第三方API你不想在测试时真的发起网络请求就可以用MockBean注入一个Mock对象。写测试的黄金法则是测试应该和代码一起提交并且每次构建时自动运行。在Maven里执行mvn test如果任何测试失败构建就应该中断。第九步打包与部署——从jar到docker一步到位SpringBoot应用可以直接打成可执行的jarfat jar包含内嵌的Tomcat部署时只需要一个java -jar命令。在pom.xml的build插件里已经加了spring-boot-maven-plugin执行mvn clean package就会在target目录下生成一个demo-0.0.1-SNAPSHOT.jar。注意它有两个版本一个带-exec后缀的可执行jar一个不带普通jar用于被其他项目依赖。启动时建议添加一些JVM参数来优化内存例如-Xmx256m -Xms256m避免默认堆内存占满服务器。如果你的应用有健康检查端点还可以加上--server.port${PORT:8080}让端口可通过环境变量配置。对于Docker部署写一个简单的DockerfileFROM eclipse-temurin:17-jre-alpine VOLUME /tmp COPY target/.jar app.jar ENTRYPOINT [java, -jar, /app.jar]注意使用jre-alpine镜像体积很小只有几十兆。暴露健康检查的端口和路径然后用docker run -p 8080:8080 demo启动。为了更方便还可以结合spring-boot-maven-plugin与docker-maven-plugin实现构建即推送。第十步常见陷阱与终极技巧——这些都是我踩过的坑配置文件加载优先级命令参数 系统环境变量 application-{profile}.yml application.yml 默认属性。所以线上环境通常用环境变量覆盖端口、数据库密码等敏感信息。Bean循环依赖SpringBoot 3.x默认禁止循环依赖如果你遇到BeanCurrentlyInCreationException请重构代码结构而不是设置spring.main.allow-circular-referencestrue。自定义Starter当你发现多个项目都在重复配置相同的日志格式、统一异常处理、跨域过滤器时就该考虑写一个公司内部的Starter了。只需在META-INF/spring.factories中配置org.springframework.boot.autoconfigure.EnableAutoConfiguration指向你的自动配置类。使用Validated校验请求参数在Controller参数上加Valid或Validated再配合NotNull等注解可以避免在代码里写一堆if判断。开启Actuator的生产就绪特性加入spring-boot-starter-actuator你就能得到/actuator/health、/actuator/info等端点方便监控和k8s探针配置。记得设置management.endpoints.web.exposure.include生产环境要限制敏感端点。线程池配置如果你用Async默认的线程池是SimpleAsyncTaskExecutor它不重用线程。记得自定义一个ThreadPoolTaskExecutorBean配置核心线程数、最大线程数、队列容量。CORS跨域问题前后端分离时写一个Bean返回WebMvcConfigurer重写addCorsMappings允许特定origin。不要用 允许所有来源尤其是在生产环境。最后一份适合所有人的启动清单当你拿到一台新电脑想要快速开始一个SpringBoot项目时按这个顺序来做装JDK 17配好环境变量装Maven 3.8配置阿里云镜像用Spring Initializr或手动创建pom.xml和启动类添加一个REST端点跑起来验证配置YAML分环境管理加入DevTools实现热部署按需集成数据库、日志、测试打包成jar放到服务器上java -jar每一步都有坑但如果你理解了原理坑就是垫脚石。整个过程中最核心的能力不是记住命令而是学会阅读错误堆栈。SpringBoot的异常信息非常友好它通常会告诉你哪个Bean创建失败、哪个属性未设置、哪个依赖缺失。你只要顺着那个提示去修复就能解决99%的问题。从零搭建一个SpringBoot项目本质上就是搭建一套可重复的工程化流程。这套流程一旦跑通你就拥有了一个可以无限复制的起点无论将来做单体应用还是微服务都从这个模板出发。现在关掉这篇文章打开终端开始你的第一个项目吧。
从零搭建SpringBoot项目的完整步骤与技巧
发布时间:2026/7/8 4:20:15
你电脑里还没有一个像样的SpringBoot项目今天就来手把手搭一个别急着去搜“Spring Boot 入门”也别打开IDE对着空白项目发呆。如果你已经折腾过几次但总卡在某个环节——比如依赖冲突、配置不生效、热部署怎么都不工作——那这篇就是为你准备的。我们会从空文件夹开始一步步构建一个真正可运行的SpringBoot项目同时把那些“官方文档说得很简单但实际操作总翻车”的细节统统掰开揉碎。真正的高效开发不是靠背步骤而是理解每一步背后的“为什么”。当你明白了SpringBoot为什么会自动配置为什么会扫描这个包而不是那个包你才能在报错时一眼看出问题所在。第一步环境准备——你不是在装软件是在搭地基很多人上来就打开IDEA点新建项目结果发现JDK版本不对、Maven下载依赖超时、Gradle构建报错——然后卡半小时。环境的统一是团队协作的起点也是你个人项目不出幺蛾子的保障。你需要准备JDK 17推荐SpringBoot 3.x 强制要求JDK 17但如果你仍用2.xJDK 8也可以Maven 3.8 或 Gradle 7这里以Maven为例IDEIntelliJ IDEACommunity版足够或者VSCode 插件有一个极易踩坑的点PATH里的JDK版本一定要和IDEA里使用的JDK版本一致。你可以在终端执行java -version和mvn -v查看如果IDEA里指定了JDK 17但系统PATH里是JDK 11Maven编译时就会报错。解决方案是统一环境变量或者在IDEA的 Settings → Build, Execution, Deployment → Build Tools → Maven → Runner 里指定JRE路径。还有一个技巧配置Maven的settings.xml加上阿里云镜像否则你第一次下载依赖可能要等10分钟。在~/.m2/settings.xmlWindows在C:\Users\你的用户名\.m2中添加mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror第二步创建项目——不要再手动建包了用Initializr我知道有些人喜欢在IDEA里直接New Project选Spring Initializr然后下一步下一步。但如果你想要完全掌控项目结构或者你的网络无法访问start.spring.io那就手动创建项目——其实就三步。第一步创建一个空目录里面放一个pom.xml。打开这个文件写入最简内容?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent groupIdcom.example/groupId artifactIddemo/artifactId version0.0.1-SNAPSHOT/version namedemo/name descriptionDemo project for Spring Boot/description properties java.version17/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project这里最关键的父依赖是spring-boot-starter-parent它帮你管理了所有官方starter的版本号你不需要再为版本冲突烦恼。当然如果你在公司里不能用parent比如已有自己的parent可以改用依赖管理方式但新手阶段只用parent最简单。接下来创建目录结构src/main/java/com/example/demo和src/main/resources。在主目录下放一个启动类package 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是一个组合注解它包含了Configuration、EnableAutoConfiguration和ComponentScan。如果你将来需要排除某些自动配置可以在它上面加exclude属性。现在在pom.xml目录下打开终端执行mvn spring-boot:run如果看到Spring的Logo和端口号恭喜你第一个SpringBoot应用跑起来了。第三步编写一个REST接口——验证你的项目是否能真正工作有一个最小可行端点比任何配置都更能确认项目状态。在com.example.demo包下新建controller子包然后创建package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { GetMapping(/hello) public String hello() { return Hello Spring Boot!; } }重启应用访问http://localhost:8080/hello你应该看到“Hello Spring Boot!”。如果访问404检查包结构HelloController必须在DemoApplication所在包或其子包下否则ComponentScan扫不到。这是新手最容易忽略的问题——把Controller放到了别的位置。假设你想自定义端口可以在src/main/resources/application.properties里写server.port8888然后重启。配置文件是整个应用的神经中枢你可以在里面配置数据源、Redis、日志级别等等。第四步配置管理的艺术——用YAML和Profile来区分环境SpringBoot支持多种配置格式推荐使用YAML因为它层级清晰并且支持多文档块。把application.properties改成application.yml写入server: port: 8080 spring: application: name: demo-service如果要区分开发和生产环境创建application-dev.yml和application-prod.yml。在application.yml里指定激活哪个spring: profiles: active: dev启动时也可以通过参数覆盖java -jar demo.jar --spring.profiles.activeprod一个更优雅的方式是使用Profile注解为不同环境提供不同的Bean。比如开发环境用嵌入式H2数据库生产环境用MySQL你只需要写两个数据源配置类加上Profile(dev)和Profile(prod)即可。还有一个常用技巧在配置文件中使用随机端口。如果你在本地同时跑多个微服务可以设置server.port${random.int(8000,9000)}避免端口冲突。但正式环境中一定要写固定端口或通过环境变量注入。第五步热部署——别再手动重启了你的时间很宝贵每次修改代码都要手动CtrlC再启动这会严重打断心流。SpringBoot提供spring-boot-devtools可以实现自动重启只重启应用不重启JVM非常快。在pom.xml添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency然后在IDEA里打开自动编译Settings → Build, Execution, Deployment → Compiler勾选“Build project automatically”。同时按住CtrlShiftA搜索“Registry”勾选compiler.automake.allow.when.app.running。注意devtools 的自动重启只监控 classpath 中的文件变更。如果你修改了模板文件如Thymeleaf可能需要额外配置spring.devtools.restart.additional-paths。另外生产环境中千万别带这个依赖。还有一个调试技巧使用LiveReload。如果你在浏览器中开发前后端结合的项目安装LiveReload插件SpringBoot会主动通知浏览器刷新。你只需要在application.yml里确保spring.devtools.livereload.enabledtrue默认就是true。第六步集成数据库——从H2到MySQL一步到位大部分真实项目都需要持久化。开发阶段用H2内存数据库可以极快启动而不用安装任何数据库服务。在pom.xml加上dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.h2database/groupId artifactIdh2/artifactId scoperuntime/scope /dependency然后在application-dev.yml里spring: datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true jpa: hibernate: ddl-auto: create-drop show-sql: true启动后访问http://localhost:8080/h2-console输入JDBC URLjdbc:h2:mem:testdb就可以看到数据库。这是开发期间调试SQL的利器。如果要切换到MySQL同样简单在application-prod.yml里spring: datasource: url: jdbc:mysql://localhost:3306/demo?useSSLfalseserverTimezoneUTCallowPublicKeyRetrievaltrue username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: false一个非常重要的细节ddl-auto在开发阶段可以用update或create-drop但生产环境要改为none或validate否则一不小心就会把表结构改掉。推荐用validate配合专门的迁移工具如Flyway、Liquibase来管理数据库版本。第七步日志系统——别等出BUG了才想起看日志SpringBoot默认使用Logback并且已经帮你配置了简单的控制台输出。但如果你需要输出到文件、按天滚动、区分日志级别就得手动配一个logback-spring.xml。在src/main/resources下创建?xml version1.0 encodingUTF-8? configuration include resourceorg/springframework/boot/logging/logback/base.xml/ springProperty scopecontext nameAPP_NAME sourcespring.application.name/ property nameLOG_PATH value${LOG_PATH:-./logs}/ appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${APP_NAME}.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log/fileNamePattern maxHistory30/maxHistory totalSizeCap3GB/totalSizeCap timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy encoder pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder /appender root levelINFO appender-ref refFILE/ appender-ref refCONSOLE/ /root /configurationspringProperty可以从application.yml读取变量比如spring.application.name这样每个微服务可以自动使用自己的服务名作为日志文件名。记得在application.yml里加上spring.application.name配置。日志格式建议包含线程名和调用者排查问题时能快速定位到具体代码行。千万不要只打印logger.info(xxx)而不加上下文信息否则你根本不知道是哪个请求出的问题。第八步单元测试与集成测试——让你敢重构的护身符很多人写完代码从来不写测试结果一改代码就崩。SpringBoot对测试的支持非常强大你只需要加入spring-boot-starter-test默认已经引入然后就可以用SpringBootTest加载完整上下文。创建一个测试类package com.example.demo; import com.example.demo.controller.HelloController; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import static org.assertj.core.api.Assertions.assertThat; SpringBootTest class DemoApplicationTests { Autowired private HelloController controller; Test void contextLoads() { assertThat(controller).isNotNull(); } }SpringBootTest会启动整个Spring应用上下文适合做集成测试。如果你只想测试特定层比如只测试Controller可以用WebMvcTest只测试Repository用DataJpaTest。这样可以大幅减少启动时间。还有一个常见技巧用MockBean模拟外部依赖。比如你的Service调用了第三方API你不想在测试时真的发起网络请求就可以用MockBean注入一个Mock对象。写测试的黄金法则是测试应该和代码一起提交并且每次构建时自动运行。在Maven里执行mvn test如果任何测试失败构建就应该中断。第九步打包与部署——从jar到docker一步到位SpringBoot应用可以直接打成可执行的jarfat jar包含内嵌的Tomcat部署时只需要一个java -jar命令。在pom.xml的build插件里已经加了spring-boot-maven-plugin执行mvn clean package就会在target目录下生成一个demo-0.0.1-SNAPSHOT.jar。注意它有两个版本一个带-exec后缀的可执行jar一个不带普通jar用于被其他项目依赖。启动时建议添加一些JVM参数来优化内存例如-Xmx256m -Xms256m避免默认堆内存占满服务器。如果你的应用有健康检查端点还可以加上--server.port${PORT:8080}让端口可通过环境变量配置。对于Docker部署写一个简单的DockerfileFROM eclipse-temurin:17-jre-alpine VOLUME /tmp COPY target/.jar app.jar ENTRYPOINT [java, -jar, /app.jar]注意使用jre-alpine镜像体积很小只有几十兆。暴露健康检查的端口和路径然后用docker run -p 8080:8080 demo启动。为了更方便还可以结合spring-boot-maven-plugin与docker-maven-plugin实现构建即推送。第十步常见陷阱与终极技巧——这些都是我踩过的坑配置文件加载优先级命令参数 系统环境变量 application-{profile}.yml application.yml 默认属性。所以线上环境通常用环境变量覆盖端口、数据库密码等敏感信息。Bean循环依赖SpringBoot 3.x默认禁止循环依赖如果你遇到BeanCurrentlyInCreationException请重构代码结构而不是设置spring.main.allow-circular-referencestrue。自定义Starter当你发现多个项目都在重复配置相同的日志格式、统一异常处理、跨域过滤器时就该考虑写一个公司内部的Starter了。只需在META-INF/spring.factories中配置org.springframework.boot.autoconfigure.EnableAutoConfiguration指向你的自动配置类。使用Validated校验请求参数在Controller参数上加Valid或Validated再配合NotNull等注解可以避免在代码里写一堆if判断。开启Actuator的生产就绪特性加入spring-boot-starter-actuator你就能得到/actuator/health、/actuator/info等端点方便监控和k8s探针配置。记得设置management.endpoints.web.exposure.include生产环境要限制敏感端点。线程池配置如果你用Async默认的线程池是SimpleAsyncTaskExecutor它不重用线程。记得自定义一个ThreadPoolTaskExecutorBean配置核心线程数、最大线程数、队列容量。CORS跨域问题前后端分离时写一个Bean返回WebMvcConfigurer重写addCorsMappings允许特定origin。不要用 允许所有来源尤其是在生产环境。最后一份适合所有人的启动清单当你拿到一台新电脑想要快速开始一个SpringBoot项目时按这个顺序来做装JDK 17配好环境变量装Maven 3.8配置阿里云镜像用Spring Initializr或手动创建pom.xml和启动类添加一个REST端点跑起来验证配置YAML分环境管理加入DevTools实现热部署按需集成数据库、日志、测试打包成jar放到服务器上java -jar每一步都有坑但如果你理解了原理坑就是垫脚石。整个过程中最核心的能力不是记住命令而是学会阅读错误堆栈。SpringBoot的异常信息非常友好它通常会告诉你哪个Bean创建失败、哪个属性未设置、哪个依赖缺失。你只要顺着那个提示去修复就能解决99%的问题。从零搭建一个SpringBoot项目本质上就是搭建一套可重复的工程化流程。这套流程一旦跑通你就拥有了一个可以无限复制的起点无论将来做单体应用还是微服务都从这个模板出发。现在关掉这篇文章打开终端开始你的第一个项目吧。