多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

IDEA创建Spring Boot Web项目完整指南:从环境配置到第一个接口

IDEA创建Spring Boot Web项目完整指南:从环境配置到第一个接口 用IDEA创建Spring Boot Web项目是很多Java开发者入门后端开发时绕不开的第一步。不论你是要做一个企业级的Web系统、给前端写接口联调还是单纯交个课程作业、搭个个人博客这套流程都是最基础的地基。这篇文章我会把这套流程完整拆开来讲从环境准备、项目创建、目录结构到写第一个接口、启动访问再到中途会踩的坑每一步的“为什么”也尽可能说清楚。适合完全没接触过IDEA的新手也适合之前用Eclipse或命令行折腾过、想彻底切到IDEA的老手。1. 开工前的准备工作环境选型与核心认知1.1 为什么选IDEA Spring Boot这套组合先聊一个最容易被忽略的问题为什么要用IDEA为什么要用Spring Boot而不是其他组合IDEAIntelliJ IDEA在Java开发圈子里几乎是事实标准。它的智能提示、代码补全、重构能力、对Spring生态的原生支持比起Eclipse和VS Code的插件方案要省心太多。你用Eclipse写一个Controller可能要手动导包、手动配Tomcat而在IDEA里只需要点几下依赖自动下载配置自动生成快捷键和窗口布局也设计得比较合理。尽管IDEA社区版是免费的但对新手来说已经足够用了。Spring Boot则是当前Java后端Web开发的主流框架。它的核心思路是“约定大于配置”把Spring MVC、内嵌Tomcat、自动装配这些东西全部封装好让你不用再手动写一堆XML配置文件。换句话说过去你要花半天配置的东西Spring Boot用几个注解就能搞定。正因为它简化了环境搭建和开发流程Spring Boot才能在后端领域迅速普及几乎所有Java岗位的招聘要求里都会出现它。把IDEA和Spring Boot组合在一起等于用一个好工具去使用一个好框架两者结合能最大程度减少环境层面的干扰让你把精力集中在业务代码上。这也是绝大多数企业级Web开发、毕业设计、个人项目选它的原因。1.2 本地环境的三个基础项JDK、Maven、IDEA版本在点击New Project之前先把本地方环境确认一遍。很多新手项目起不来往往不是代码问题而是JDK、Maven和IDEA之间版本不匹配。第一是JDK。Spring Boot 2.x版本对JDK 8和JDK 11支持得最好Spring Boot 3.x则要求JDK 17以上。如果你只是学习Web开发装JDK 8或JDK 17都可以但建议优先JDK 17因为现在新项目越来越多地切到Spring Boot 3.xJDK 17是长期支持版本也能避免将来因为版本太旧而迁移。JDK装好后要在IDEA里确认Project Structure中配置的SDK指向正确不要出现系统里装的是JDK 17、IDEA里却选了JDK 8这种低级问题。第二是Maven。IDEA自带了一个Maven但那个自带的版本有时会抽风建议自己下载一个Maven并配置好本地仓库地址和阿里云镜像。原因很简单Spring Boot项目创建后要下载大量依赖这些依赖默认从Maven中央仓库拉取国内访问速度时快时慢配置镜像能大幅减少等待时间。Maven的settings.xml里需要改两个地方一个是本地仓库路径localRepository一个是mirror镜像这两项配好以后创建项目会顺畅很多。第三是IDEA版本。专业版Ultimate内置了Spring Initializr可以直接在新建项目时选择Spring Boot框架社区版Community免费但新建项目时没有Spring Initializr入口。如果用的是社区版也不是不能创建需要用IDEA自带的项目向导先建一个普通Maven项目再手动往pom.xml里加Spring Boot依赖或者直接去Spring官网的initializr页面下载压缩包再导入。这部分后面聊问题时会细说。提示如果你所在网络环境访问Spring Initializr的服务不稳定可以在IDEA设置里把创建项目时用到的服务地址换成阿里云的镜像地址https://start.aliyun.com这是一个安全合规的国内镜像很多开发者都在用。1.3 一个合理的实操顺序每次有新手问我“第一步干嘛”我给的回答都是先装JDK再装Maven最后装IDEA。这个顺序不是随便排的因为IDEA启动时会自动探测本机的JDK路径如果你先装JDK再装IDEAIDEA就能自动识别反过来先装IDEA再装JDK虽然也可以手动配置但多了一步。装好之后最好先在命令行里验证一下环境变量。Windows下打开cmd输入java -version应该能看到JDK版本信息输入mvn -v应该能看到Maven版本。IDEA的File - Settings - Build, Execution, Deployment - Build Tools - Maven里再确认一下Maven home path指向你解压的Maven目录。这套配置只需要做一次但能帮你避开后续90%的依赖类问题。2. 用IDEA创建Spring Boot Web项目的完整步骤2.1 从New Project开始Spring Initializr的填写细节环境准备好以后打开IDEA点击New Project左侧选择“Spring Initializr”。需要填写三个维度的信息项目元数据、项目类型、依赖。项目元数据有group、artifact、name这些概念。group通常写公司域名倒序比如com.exampleartifact写项目名比如demo。很多人不明白这两项的意义其实它们会最终拼成项目的包名也就是Java代码存放的根目录路径。比如group是com.exampleartifact是demo那么默认包名就是com.example.demo对应的目录是一层一层嵌套的文件夹。不要随便乱写因为一旦项目创建完成改包名是很麻烦的事。Type下拉框里选Maven这对应项目构建方式。Java Version选你本机安装的JDK大版本IDEA里这一项有时候会根据系统JDK自动给出默认值但建议手动确认一次。Language选JavaPackaging一般选Jar因为Spring Boot默认用内嵌Tomcat打成Jar包就能直接运行不需要再部署到外部Tomcat。这里有个小细节专业版的Spring Initializr默认连接的在线服务有时候不稳定如果你点击Next之后页面一直转圈可以在Settings里把Server URL改为阿里云镜像地址。如果你用的是新版IDEA可能界面上写作“Spring Boot”而不是“Spring Initializr”但本质一样都是通过在线生成器拉取项目模板。2.2 勾选依赖的学问不能乱勾也不能不勾到了选择依赖Dependencies这一步很多人会随便选一堆但这里我建议“够用就好”。因为每勾选一个依赖启动时就要多加载一堆自动配置类依赖之间还可能互相干扰。对于最基础的Web项目只需要勾选两个依赖就够了Spring Web提供Spring MVC框架和内嵌Tomcat是Web项目的核心依赖Spring Boot DevTools提供热部署和自动重启功能开发时能省去手动重启的烦恼第三个可选的是Lombok它通过注解帮你自动生成getter、setter、构造方法这些样板代码能减少代码量但前提是IDEA里要装Lombok插件并且在设置里开启Annotation Processing。新手如果不想额外处理插件问题可以先不勾等项目跑起来后再补也不迟。其他依赖如Spring Data JPA、MyBatis、Spring Security等都属于具体业务功能等你做到数据库操作和权限控制的时候再加。尤其是Spring Security新手一上来就勾上往往会遇到“所有请求都被拦截”的问题因为它的默认行为就是全部受保护反而会影响你对Spring Boot基础流程的理解。2.3 首次加载与Maven同步等多久都算正常点击Finish之后IDEA会自动开始下载Maven依赖。这一步是新手最容易焦虑的环节因为底部状态栏会一直转项目左侧目录可能还是空空的看起来像卡死了。实际上Spring Boot项目创建后的第一次Maven同步需要从本地仓库或镜像源下载几十个Jar包。如果网络状态一般等个五分钟到十几分钟都很正常。判断是否成功的标志是看右侧Maven工具窗口里项目的Dependencies列表能不能正常展开以及pom.xml文件里有没有红色波浪线报错。如果你的pom.xml出现了红色波浪线把鼠标移上去会看到类似“Cannot resolve xxx”的错误这表示对应的依赖没有下载成功。最常见的原因是网络原因导致下载中断解决办法是在IDEA的Maven设置里加上阿里云镜像然后点击Maven工具窗口的“刷新”按钮让IDEA重新下载。注意下载依赖的过程中不要随意关掉IDEA也不要反复点击刷新。有时候你点得越频繁反而因为并发请求导致仓库源限流。耐心等一次同步完成比反复重试更有效。2.4 第一次看到项目结构别急着写代码项目同步成功后你会看到一套标准化的目录结构。src/main/java是Java源码所在位置src/main/resources放配置文件和静态资源src/test/java放单元测试代码。最关键的还有一个启动类类名通常是项目名Application里面有一个main方法标注着SpringBootApplication注解。这个启动类就是整个项目的入口。Spring Boot启动时会从它所在的位置向下扫描所有子包找出带Controller、Service、Repository这些注解的类并注册为Bean。所以启动类必须放在所有组件的根包位置上比如com.example.demo的包下面而不能和Controller平级乱放否则Spring扫不到你写的接口类这就是很多初学者“代码明明写了但访问404”的根本原因。这时候我建议你先不做任何修改直接右键启动类选择Run看一次最原始的“Hello World式启动”是什么效果。如果控制台输出类似Started DemoApplication in x.xxx seconds并且末尾没有报错说明项目骨架已经打通了。3. 项目骨架与核心配置第一次真正看懂Spring Boot3.1 启动类、配置文件和目录职责一个Spring Boot项目跑起来真正核心的其实只有三个东西启动类、配置文件、以及你写的业务代码。启动类上面提过主要靠SpringBootApplication这个复合注解干活。它其实组合了三个更小的注解SpringBootConfiguration负责声明配置类EnableAutoConfiguration负责启动自动装配ComponentScan负责包扫描。自动装配这件事最容易让人困惑简单打个比方你勾选了一个Starter依赖就像在超市里买了个半成品套餐Spring Boot看到你买了这个套餐会自动把配套的锅碗瓢盆都备好。比如你引入了spring-boot-starter-web它就自动配置好Tomcat和Spring MVC不需要你自己去创建Tomcat实例。src/main/resources目录下面是两个默认文件application.properties和application.yml。本质上它们都是配置文件只是格式不同。properties文件用等号分隔配置项yml文件用缩进和冒号。大多数新项目现在默认生成properties格式看个人习惯。配置文件里最常用的是端口设置和上下文路径。比如你在application.properties里写server.port8081 server.servlet.context-path/api这个配置的意思是让项目运行在8081端口并且所有接口地址前都要加/api前缀。改完配置后需要重启项目才会生效。这个文件的重要性在于它把代码里的硬编码值抽出来了以后部署到不同环境只需要改配置不需要改代码。3.2 pom.xml的关键依赖与版本管理机制pom.xml是Maven项目的核心文件也是Spring Boot项目里最值得仔细看一遍的配置。新建项目生成的第一行核心内容是一个parent标签指向spring-boot-starter-parent。这个parent标签不是给当前项目用的而是被Spring Boot官方定义好的一个“模板父工程”。它帮你锁定了所有官方Starter依赖的版本号避免了版本冲突。比如你引入spring-boot-starter-web时不需要写版本号因为它会从父工程里继承。这个设计非常实用因为Java生态的依赖版本冲突是出了名的噩梦有了统一的版本管理你至少不会因为Spring Boot自身的依赖打架而头痛。再看你勾选的spring-boot-starter-web它本身又是一个“聚合依赖”里面间接引入了spring-web、spring-webmvc、spring-boot-starter-tomcat、jackson等等。这也是为什么你在pom.xml里只写了一个依赖Maven却会下载十几个Jar包的原因。理解这个聚合设计的思路你以后加依赖时就能分辨Starter是某个场景的集合包而不是单一功能的库。如果后续需要引入数据库连接池、MyBatis、Redis等组件也要遵循同一规律到Maven仓库搜索对应场景的starter即可。自己手动引入一堆老版本jar的方式在Spring Boot项目里是不推荐的做法因为你得自己处理兼容性很容易出现问题。3.3 配置文件里的常见参数除了server.port之外刚开始开发时还会经常用到几个参数。spring.application.name用来给应用起名字这个名字在多个微服务相互调用时尤为重要spring.jackson.date-format和spring.jackson.time-zone用来规范接口返回的日期格式否则你返回一个LocalDateTime前端拿到手可能是数组或带字母T的字符串logging.level.rootinfo用来控制日志输出级别调试时需要看到SQL或请求细节时可以临时改成debug。如果你用IDEA打开配置文件会发现它对属性名有自动提示而且支持按Ctrl鼠标点击跳转到对应的属性定义。这个功能依赖的是spring-boot-configuration-processor也就是所谓的“配置元数据”当你自己写自定义配置类时也可以用到。新手阶段不用纠结原理只需要知道IDEA能帮你检查配置项拼写是否正确就够了。4. 动手写第一个Web接口把项目跑起来4.1 编写ControllerRestController与GetMapping项目骨架确认没问题后开始写接口。在src/main/java的包下面新建一个类名字随便起比如HelloController。这个类用来接收外部HTTP请求。代码如下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 hello() { return Hello Spring Boot!; } }这里有两个核心注解。RestController表示这个类是一个处理HTTP请求的控制器并且方法返回值会直接以字符串或JSON格式写回浏览器不需要再经过视图解析器。如果换成传统的Controller方法返回的字符串会被当成页面名称去找模板文件所以你要想返回一个纯文本或JSON数据直接用RestController最省事。GetMapping(/hello)把GET请求和下面的方法绑定在一起浏览器访问http://localhost:8080/hello时就会执行这个方法。这只是最基础的一种映射方式后面你还可以根据业务需求用PostMapping处理表单提交用PathVariable提取URL里的参数用RequestBody接收JSON请求体。但核心心智模型就一个注解把“某类请求”和“某个方法”关联起来。4.2 启动项目并访问验证写完Controller后回到启动类点main方法前面的绿色三角按钮选Run。控制台会滚动输出一堆日志。当你看到类似Tomcat started on port 8080 (http)和Started DemoApplication in 2.xxx seconds的信息时说明项目启动成功。这时候打开浏览器输入http://localhost:8080/hello页面会直接显示Hello Spring Boot!那个字符串。很多新手会疑惑为什么访问一个Java项目不需要单独启动Tomcat因为Spring Boot的Web项目里内置了Tomcat项目启动时就会通过内嵌的方式把Tomcat一起拉起来。所以你在IDEA里点一次Run等于把应用和Web服务器全部启动了这也是Spring Boot开发体验流畅的原因之一。如果访问时出现404大概率是请求路径写错了检查URL和控制器里的映射是否一致。如果出现405说明请求方式不对比如你浏览器直接访问的是POST接口。如果页面直接显示“无法访问”优先检查端口号确认是不是8080或者是不是被你改成了别的值。4.3 热部署体验DevTools是真的能提升体验在依赖勾选阶段我特别提到DevTools这里来说它到底干了什么。没有DevTools的时候你改一次代码就得手动停止应用再重新启动非常耽误事。DevTools的核心机制是检测到类路径下的文件发生变化后自动重启当前应用。它和手动重启的区别在于DevTools的重启速度更快因为它隔离了依赖类只加载你自己修改的类。具体操作很简单IDEA里修改代码后按一下CtrlS保存DevTools会自动触发重启控制台里能看到Restarting相关日志过两秒应用就重新处于可用状态。配合IDEA的自动编译功能几乎一点延迟都感受不到。但这里有个要注意的点如果你只改了配置文件比如application.propertiesDevTools默认不会自动重启因为配置文件属于资源文件。实际上很多情况下你希望配置文件的变更也能立即生效那么可以再引入spring-boot-devtools的触发文件机制或者手动重启项目。更方便的办法是直接在IDEA中点击Run面板右上角的“重启”按钮配置文件改动大多都能被IDEA动态更新具体速度取决于IDEA版本和项目规模。4.4 修改端口和上下文路径刚才提到了端口的配置这个是实际开发中几乎必改的选项。因为后端的接口经常不是部署在8080要么是8080被其他软件占用了要么是你一个机器上要跑多个Spring Boot实例端口号就得错开。在application.properties里改server.port8081保存后重启项目再访问时就要用http://localhost:8081/hello。改端口后要留意一个东西如果你开了DevTools热部署配置文件变更不一定会触发重载所以改完端口后建议手动重启应用。另外如果你设定了server.servlet.context-path/api那访问路径就变成http://localhost:8081/api/hello。这个前缀的实际作用就是给所有接口加统一命名空间很多企业项目的接口前缀用/api来区分前后端分离风格的路径部署到网关时也方便做转发规则。5. IDEA中从零跑通Web项目的常见问题排查5.1 端口被占用报错信息与解决思路最常见的启动失败场景就是端口被占用。控制台通常会出现类似Port 8080 was already in use的报错然后紧接着Web server failed to start。这个问题一般发生在你重复启动项目或者本机有其他程序已经占用了8080端口。旧版本的IDEA或者Spring Boot Boot运行机制有时不会自动释放上一次运行的端口导致你再次启动时发现端口被占着。解决方式有两种。第一种最直接把当前端口改掉。在application.properties里换一个端口号比如8081然后重新启动简单高效。第二种是找到占用端口的进程把它结束掉。Windows上可以用命令netstat -ano | findstr 8080查到占用端口的PID然后在任务管理器的“详细信息”里找到这个PID对应的进程手动结束任务。macOS或Linux上用lsof -i:8080也可以看到对应进程。不过我不太建议一上来就杀进程因为有时候占端口的恰好是你之前启动的同一个项目杀掉反而把原本正常的进程误伤了。判断流程是先看控制台日志里是“之前的应用还活着”还是“真有别的程序”再决定杀进程还是改端口。5.2 依赖下载慢或失败Maven镜像的正确配置方式前文提到国内开发者在创建Spring Boot项目时最大的耐心考验就是Maven依赖下载。默认的中央仓库地址在大陆访问确实性能不稳定这不是代码问题是网络链路问题。解决方案是配置国内镜像。找到Maven安装目录下的conf/settings.xml把默认的mirror替换为阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf nameAliyun Public Maven Repository/name urlhttps://maven.aliyun.com/repository/public/url /mirror改好后在IDEA的Maven settings里确认指向你修改过的settings.xml然后回到项目点击Maven工具窗口的刷新按钮。这里有一个细节IDEA里Maven仓库路径和settings.xml路径应该保持一致否则你改了本地settings.xmlIDEA用的还是它自己内置的那份等于没改。进入File - Settings - Build, Execution, Deployment - Build Tools - Maven把User settings file选成你修改过的路径即可。5.3 IDEA报“Cannot start internal HTTP server”怎么办有一个典型的IDEA报错出现在创建Spring Boot项目或者打开项目的时候提示Cannot start internal HTTP server. Git integration, JavaScript debugger and LiveEdit may operate with errors。先说结论这个报错不是项目代码的问题是IDEA自身的内部HTTP服务端口无法正常启动导致的。它的作用是用来支持IDEA的一些内置功能比如Git提交时的代码检查、Live Edit热更新等跟你的Spring Boot项目本身没有直接关系。常见诱因是IDEA运行环境下的网络代理配置或端口被占用。处理方式大致有三步第一重启IDEA有时候只是IDE进程没完全释放端口重启后就能恢复第二检查自己IDEA设置里是否开了代理在Settings里搜索Proxy如果有代理配置先改成No proxy或检查代理地址是否有效第三如果依然报错可以尝试删除IDEA系统缓存具体路径在idea的安装目录下或用户目录下的.IntelliJIdeaXXX/system目录删除后重启IDEA它会重新建立索引和内部服务。这个路径删除只是影响IDE本地缓存不会动你的项目代码。5.4 IDEA社区版和专业版的实操差异由于IDEA专业版需要付费很多学习阶段的同学都用社区版。那么社区版能不能创建Spring Boot Web项目可以但稍微别扭一点。专业版新建项目时可以直接用Spring Initializr在线生成模板。社区版没有这个入口。我建议社区版用户换一种方式先打开Spring官网的initializr页面在页面上填好项目元数据和依赖点击Generate下载一个压缩包解压后用IDEA打开这个项目文件夹。IDEA识别到里面的pom.xml后会自动把它当Maven项目导入然后自动下载依赖之后的流程就完全一样了。另一种方式是本地手动搭Maven项目即新建一个普通Maven项目然后在pom.xml里手动加入spring-boot-starter-parent和spring-boot-starter-web仍然是从Maven仓库拉取依赖但需要注意手动指定项目的JDK版本和Spring Boot版本配置成本会高一些。如果不想折腾用官网生成的压缩包是最稳的路径。5.5 连接不到Spring Initializr服务时的处理“创建项目时一直转圈”是很多网络环境下的老问题。Spring官方生成服务的地址是https://start.spring.io如果你的网络访问它不稳定IDEA的新建项目向导就可能一直卡住。在IDEA专业版里可以到Settings中搜索Spring Initializr或在HTTP Proxy设置中调整网络也可以直接把默认的生成地址换成国内镜像例如https://start.aliyun.com。这样新建项目时IDEA会从这个镜像地址拉取模板速度会有明显提升。配置界面里的URL一改新建项目时就不需要再等海外地址了。6. 从第一个接口到一个完整Web项目NEXT步怎么走项目跑通、接口能访问之后大多数人接下来都会关心同一个问题后面该怎么继续扩展我根据自己的经验梳理了一个简单可行的顺序你可以参考。第一步先学会写RESTful风格的接口。把之前的Controller里加几个方法接收路径参数和查询参数返回JSON格式的数据。Spring Boot里用RequestParam接收?namexxx这种参数用PathVariable接收/user/{id}这种路径中的参数这两个注解是后端接口开发中最常用的基础。第二步引入数据库相关的组件。从JDBC到MyBatis再到现在常用的Spring Data JPA这一层是后端开发的骨架。Spring Boot官方提供spring-boot-starter-data-jpa或者选择MyBatis的starter并配置数据源。这里会涉及到连接池、事务管理、SQL映射等一系列概念任何一个展开都能写一整篇但你要理解的核心原则是数据库连接不直接写在业务代码里而是通过配置文件交给Spring容器管理。第三步学一下Spring Boot的配置属性绑定。当你发现业务代码里出现大量硬编码值时就该考虑用ConfigurationProperties把这些值整理到一个配置类里再通过application.yml给它们赋值。这个能力在企业项目中几乎是标配它让程序变得更加灵活。第四步理解自动配置的原理。Spring Boot最牛的一点就是自动配置但自动配置往往也是个黑盒。建议你有时间时点开spring-boot-autoconfigure这个Jar包里的源码挑一个你熟悉的类看看条件装配的注解比如ConditionalOnMissingBean。你会发现在看似“魔法”的背后其实就是一堆条件和判断原理比你想得更简单。这一路走下来你对IDEA和Spring Boot的理解就会从“会操作”变成“懂原理”。有了这个基础后面无论是做毕业设计、接外包项目还是进公司实习你都能比较快地适应别人项目的代码风格和目录结构因为Spring Boot项目在骨架层面是高度相似的。在今天这套流程里我个人的体会是与其记步骤不如记意图。创建项目时知道每个选项是干嘛的配置依赖时知道每个Starter背后管什么出现报错时能根据关键词定位原因这种“理解型学习”比单纯记住一个流程有用得多。你只要把这一套从头到尾自己敲一遍哪怕中间多踩几个坑收获也比看十篇教程大。希望这篇分享能帮你把项目的第一个版本顺利跑起来然后从这个起点一步步写出你自己的Web应用。
返回列表