这类视频标题经常让人感觉“三小时搞定”很轻松但真到动手时环境、依赖、配置、报错每一步都可能卡住。SpringBoot 的学习核心不是看视频而是能不能在看完之后自己从零跑通一个能连数据库、能做接口、能处理权限、还能生成文档的完整项目。这篇文章不讲“速成”而是拆解一个 SpringBoot 项目从环境准备到核心功能上线的完整实操路径。我会把重点放在环境怎么配、依赖怎么加、配置怎么写、代码怎么调、问题怎么查这几个环节。如果你刚接触 SpringBoot或者看视频感觉都会、一动手就废那下面的内容就是为你准备的。我建议的学习顺序是先确保本地开发环境JDK、Maven、IDEA能跑起来然后创建一个最简单的 Web 项目接着引入数据库和缓存再处理权限和接口文档最后打包部署。每一步我都会说明关键配置和常见坑点。1. 环境准备别在第一步就卡住很多人一上来就跟着视频敲代码结果项目都创建失败。环境是地基必须先打牢。1.1 JDK、Maven 和 IDEA 的版本对齐SpringBoot 3.x 需要 JDK 17 或更高版本。如果你还在用 JDK 8创建 SpringBoot 3 项目大概率会失败。我一般会先统一版本JDK长期支持LTS版本是首选。对于 SpringBoot 3.x直接安装 JDK 17 或 JDK 21。可以在命令行用java -version确认。Maven版本 3.6.3 以上基本都兼容。重点不是版本号而是配置好本地仓库路径和阿里云镜像否则下载依赖会非常慢甚至超时。你的settings.xml文件里应该有这样一段mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrorIDEA社区版或旗舰版均可。确保 IDEA 里配置的 JDK 和 Maven 就是你刚才安装的版本。在File - Settings - Build, Execution, Deployment - Build Tools - Maven里检查。注意不要使用系统自带的或路径里混杂的多个 JDK 版本这会导致编译和运行时的类版本不一致报错信息会非常迷惑。1.2 使用 Spring Initializr 创建项目而不是手动搭手动创建 Maven 项目再添加 SpringBoot 依赖很容易出错。最稳妥的方式是使用Spring Initializr它内置于 IDEA 中也可以访问 start.spring.io 在线生成。在 IDEA 里创建新项目时选择Spring Initializr。关键配置如下Project SDK选择你安装好的 JDK 17/21。Spring Boot选择当前稳定版如 3.2.x。对于新手不建议选快照SNAPSHOT或里程碑M版本。Project MetadataGroup通常用公司域名倒写如com.example。Artifact项目名如demo。Packaging选Jar现在 SpringBoot 主流打包方式。Java Version和你 JDK 版本对应如17。Dependencies这里先选最基础的。对于入门我建议先只选Spring Web。这会产生一个最简单的 Web 应用。数据库、安全等依赖我们后面手动加这样你能更清楚每个依赖的作用。点击创建后IDEA 会自动下载项目骨架和初始依赖。第一次可能会慢取决于你的网络和 Maven 镜像配置。2. 第一个接口从“Hello World”到理解 MVC项目创建成功后先别急着加功能。跑通第一个接口理解请求怎么进来、怎么处理、怎么返回。2.1 创建控制器和启动应用在src/main/java/com/example/demo下新建一个类HelloControllerpackage 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 sayHello() { return Hello, SpringBoot!; } }然后找到主类DemoApplication通常带有SpringBootApplication注解直接运行它的main方法。如果控制台没有报错最后看到类似Tomcat started on port(s): 8080的日志说明启动成功。打开浏览器访问http://localhost:8080/hello你应该能看到返回的文字。这一步的意义确认你的基础开发环境JDK, Maven, IDEA和 SpringBoot 项目本身是正常的。如果这里就卡住问题大概率在环境而不是代码。2.2 理解核心注解和流程SpringBootApplication这是一个组合注解标记这是 SpringBoot 的主启动类开启了自动配置和组件扫描。RestController告诉 Spring这个类是一个控制器并且它返回的数据直接写入 HTTP 响应体通常是 JSON 或文本而不是跳转到一个视图页面。GetMapping(“/hello”)将 HTTP GET 请求映射到sayHello方法上。这就是 Spring MVC 最核心的流程请求 - 映射 - 方法处理 - 返回响应。先把这个流程跑通建立信心。3. 连接数据库让数据“活”起来Web 应用离不开数据持久化。MySQL 是最常见的选择。这里我们连接 MySQL并用 MyBatis-Plus 来简化数据库操作。3.1 MySQL 安装与基础配置如果你还没有 MySQL去官网下载社区版安装。安装过程中记住你设置的root密码。安装后建议用命令行或 MySQL Workbench、Navicat 等工具创建一个用于本项目的数据库CREATE DATABASE springboot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;utf8mb4字符集能更好地支持中文和表情符号。3.2 在项目中引入 MySQL 和 MyBatis-Plus在项目的pom.xml文件中添加以下依赖dependencies !-- 之前已有的 Spring Web 依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MySQL 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- MyBatis-Plus 启动器 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.5/version !-- 使用当前稳定版本 -- /dependency !-- Lombok用于简化实体类代码可选但推荐 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies添加依赖后IDEA 可能会提示 Maven 导入点击导入或刷新 Maven 项目。3.3 配置数据源和 MyBatis-Plus在src/main/resources/application.properties或application.yml中配置数据库连接# 数据库连接配置 spring.datasource.urljdbc:mysql://localhost:3306/springboot_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password你的密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # MyBatis-Plus 配置 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印SQL调试用 mybatis-plus.global-config.db-config.id-typeauto # 主键策略AUTO 表示数据库自增注意useSSLfalse在本地开发环境常用生产环境应设置为true并提供证书。serverTimezone必须设置避免时区导致的日期时间问题。3.4 创建实体、Mapper 和服务层实体类对应数据库表。假设我们有一张user表。package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; Data TableName(user) // 指定表名如果类名和表名一致可省略 public class User { TableId(type IdType.AUTO) // 主键自增 private Long id; private String username; private String email; // getter, setter 由 Lombok Data 注解自动生成 }Mapper 接口继承 MyBatis-Plus 的BaseMapper无需写 XML。package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; public interface UserMapper extends BaseMapperUser { // 基本的 CRUD 方法已由 BaseMapper 提供 }在启动类或配置类上添加 Mapper 扫描SpringBootApplication MapperScan(com.example.demo.mapper) // 指定你的 Mapper 接口所在包 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }创建 Service 和 Controller// UserService.java package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.entity.User; public interface UserService extends IServiceUser { } // UserServiceImpl.java package com.example.demo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { } // UserController.java package com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; RestController RequestMapping(/user) public class UserController { Autowired private UserService userService; GetMapping(/list) public ListUser listUsers() { return userService.list(); // 查询所有用户 } PostMapping(/add) public boolean addUser(RequestBody User user) { return userService.save(user); } }现在重启应用。你可以用 Postman 或浏览器测试GET http://localhost:8080/user/list和POST http://localhost:8080/user/addBody 传 JSON接口了。记得先在数据库创建好user表。常见问题Failed to configure a DataSource检查application.properties中的数据库连接信息URL、用户名、密码是否正确数据库服务是否启动。Invalid bound statement (not found)检查MapperScan注解的包路径是否正确Mapper 接口是否被扫描到。Table ‘xxx’ doesn‘t exist检查实体类TableName注解的值是否和数据库表名一致。4. 集成 Redis引入缓存和会话管理Redis 常用于缓存热点数据、存储会话、实现分布式锁等。在 SpringBoot 中集成 Redis 非常方便。4.1 本地安装与运行 RedisWindows 用户可以从 GitHub 下载 Redis 的 Windows 版本压缩包解压后运行redis-server.exe。更推荐使用 WSL2 或 Docker 运行 Redis以获得更接近生产环境的行为和更好的性能。Linux/macOS 用户通常可以通过包管理器安装如apt install redis-server或brew install redis。安装后在命令行运行redis-cli ping如果返回PONG说明 Redis 服务已启动。4.2 项目引入 Spring Data Redis在pom.xml中添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency如果使用 Lettuce 连接池默认且推荐可能需要额外引入池化依赖dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency4.3 配置 Redis 连接在application.properties中配置# Redis 配置 spring.data.redis.hostlocalhost spring.data.redis.port6379 spring.data.redis.database0 # 默认 DB 索引 spring.data.redis.password # 如果没有密码就留空 spring.data.redis.lettuce.pool.max-active8 # 连接池最大连接数 spring.data.redis.lettuce.pool.max-idle8 spring.data.redis.lettuce.pool.min-idle04.4 使用 RedisTemplate 进行缓存操作SpringBoot 会自动配置RedisTemplate和StringRedisTemplateBean。你可以直接注入使用package com.example.demo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.web.bind.annotation.*; import java.util.concurrent.TimeUnit; RestController RequestMapping(/cache) public class CacheController { Autowired private RedisTemplateString, Object redisTemplate; PostMapping(/set) public String setCache(RequestParam String key, RequestParam String value) { ValueOperationsString, Object ops redisTemplate.opsForValue(); ops.set(key, value, 60, TimeUnit.SECONDS); // 设置键值对60秒后过期 return OK; } GetMapping(/get) public Object getCache(RequestParam String key) { ValueOperationsString, Object ops redisTemplate.opsForValue(); return ops.get(key); } }你也可以使用更优雅的Cacheable注解来实现方法级别的缓存这需要额外配置CacheManager。集成验证启动应用调用/cache/set接口设置一个值再调用/cache/get接口获取。同时你可以打开redis-cli用keys *和get your_key命令验证数据是否确实存入了 Redis。5. 实现权限认证保护你的接口不是所有接口都应该被随意访问。基于 Token 的权限认证如 JWT是前后端分离架构的常见选择。5.1 引入 Spring Security 和 JWT 依赖在pom.xml中添加dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency !-- JWT 工具库这里选用 jjwt -- dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.12.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.12.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.12.5/version scoperuntime/scope /dependency5.2 核心配置安全配置类和 JWT 工具类JWT 工具类负责生成和解析 Token。package com.example.demo.config; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; import javax.crypto.SecretKey; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.function.Function; Component public class JwtTokenUtil { Value(${jwt.secret}) // 从配置文件中读取密钥 private String secret; Value(${jwt.expiration}) // Token 有效期秒 private Long expiration; private SecretKey getSigningKey() { return Keys.hmacShaKeyFor(secret.getBytes()); } // 生成 Token public String generateToken(UserDetails userDetails) { MapString, Object claims new HashMap(); // 可以在这里放入自定义信息如用户角色 return doGenerateToken(claims, userDetails.getUsername()); } private String doGenerateToken(MapString, Object claims, String subject) { return Jwts.builder() .claims(claims) .subject(subject) .issuedAt(new Date(System.currentTimeMillis())) .expiration(new Date(System.currentTimeMillis() expiration * 1000)) .signWith(getSigningKey(), Jwts.SIG.HS256) .compact(); } // 从 Token 中解析用户名 public String getUsernameFromToken(String token) { return getClaimFromToken(token, Claims::getSubject); } // 验证 Token 是否有效 public Boolean validateToken(String token, UserDetails userDetails) { final String username getUsernameFromToken(token); return (username.equals(userDetails.getUsername()) !isTokenExpired(token)); } // 其他辅助方法isTokenExpired, getClaimFromToken 等... }在application.properties中添加配置jwt.secretYourSuperSecretKeyHereMakeItLongAndComplex jwt.expiration86400 # 24小时安全配置类继承WebSecurityConfigurerAdapterSpring Security 5.7 及 SpringBoot 3.x 推荐使用组件式配置这里以 Lambda DSL 风格示例。package com.example.demo.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; Configuration EnableWebSecurity public class SecurityConfig { Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; // 需要自定义的过滤器 Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf - csrf.disable()) // 禁用 CSRF因为使用无状态 JWT .sessionManagement(session - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 无状态会话 .authorizeHttpRequests(auth - auth .requestMatchers(/auth/login, “/hello”).permitAll() // 登录接口和测试接口放行 .anyRequest().authenticated() // 其他所有请求都需要认证 ) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); // 添加 JWT 过滤器 return http.build(); } Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); // 密码加密器 } Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception { return authConfig.getAuthenticationManager(); } }自定义 JWT 过滤器用于拦截请求验证 Token。package com.example.demo.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; Component public class JwtAuthenticationFilter extends OncePerRequestFilter { Autowired private JwtTokenUtil jwtTokenUtil; Autowired private UserDetailsService userDetailsService; Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String authHeader request.getHeader(“Authorization”); String token null; String username null; if (authHeader ! null authHeader.startsWith(“Bearer “)) { token authHeader.substring(7); username jwtTokenUtil.getUsernameFromToken(token); } if (username ! null SecurityContextHolder.getContext().getAuthentication() null) { UserDetails userDetails this.userDetailsService.loadUserByUsername(username); if (jwtTokenUtil.validateToken(token, userDetails)) { UsernamePasswordAuthenticationToken authentication new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } } chain.doFilter(request, response); } }实现 UserDetailsService从数据库加载用户信息。package com.example.demo.service; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.util.ArrayList; Service public class CustomUserDetailsService implements UserDetailsService { Autowired private UserMapper userMapper; Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 这里假设 username 字段是唯一的 User user userMapper.selectOne(new QueryWrapperUser().eq(“username”, username)); if (user null) { throw new UsernameNotFoundException(“User not found with username: “ username); } // 返回 Spring Security 的 User 对象。实际项目中应从数据库查询用户的角色/权限列表 return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), // 密码应该是加密后存储的 new ArrayList() // 这里先给空权限列表 ); } }创建认证控制器提供登录接口。package com.example.demo.controller; import com.example.demo.config.JwtTokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; RestController RequestMapping(“/auth”) public class AuthController { Autowired private AuthenticationManager authenticationManager; Autowired private JwtTokenUtil jwtTokenUtil; Autowired private CustomUserDetailsService userDetailsService; PostMapping(“/login”) public MapString, String login(RequestBody MapString, String loginRequest) { String username loginRequest.get(“username”); String password loginRequest.get(“password”); // 认证 Authentication authentication authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password) ); // 认证成功后生成 Token final UserDetails userDetails userDetailsService.loadUserByUsername(username); final String token jwtTokenUtil.generateToken(userDetails); MapString, String response new HashMap(); response.put(“token”, token); return response; } }现在你的应用就有了基础的 JWT 认证。访问/user/list等受保护接口时需要在请求头中添加Authorization: Bearer your_jwt_token。6. 生成接口文档让前后端协作更顺畅手动维护接口文档费时费力且容易过时。SpringDoc OpenAPISwagger UI 的集成可以自动根据代码生成可交互的 API 文档。6.1 引入 SpringDoc OpenAPI 依赖在pom.xml中添加dependency groupIdorg.springdoc/groupId artifactIdspringdoc-openapi-starter-webmvc-ui/artifactId version2.5.0/version !-- 使用与 SpringBoot 3.x 兼容的版本 -- /dependency6.2 基本配置与访问添加依赖后几乎无需任何配置SpringBoot 会自动配置。启动应用访问以下 URLAPI 文档 JSONhttp://localhost:8080/v3/api-docsSwagger UI 界面http://localhost:8080/swagger-ui/index.html在 Swagger UI 界面上你可以看到所有被RestController标注的控制器及其接口并可以直接进行接口测试。6.3 使用注解增强文档默认生成的文档信息比较基础。你可以使用注解来补充描述、参数说明等RestController RequestMapping(“/user”) Tag(name “用户管理”, description “用户相关的增删改查接口”) // 给控制器加描述 public class UserController { Autowired private UserService userService; Operation(summary “获取用户列表”) // 给接口方法加描述 GetMapping(“/list”) public ListUser listUsers() { return userService.list(); } Operation(summary “添加用户”) PostMapping(“/add”) public boolean addUser(RequestBody Parameter(description “用户对象”, required true) User user) { return userService.save(user); } }你还可以在application.properties中配置文档的全局信息springdoc.api-docs.path/api-docs springdoc.swagger-ui.path/swagger-ui.html springdoc.swagger-ui.operationsSortermethod # 配置文档信息 springdoc.info.titleSpringBoot 演示项目 API springdoc.info.versionv1.0 springdoc.info.description这是一个集成示例项目的接口文档6.4 处理 Spring Security 对文档页面的拦截如果你集成了 Spring Security默认会拦截/swagger-ui/**和/v3/api-docs/**路径。需要在SecurityConfig的filterChain方法中将这些路径放行.requestMatchers(“/auth/login”, “/hello”, “/swagger-ui/**”, “/v3/api-docs/**”, “/swagger-resources/**”, “/webjars/**”).permitAll()7. 项目打包与部署从开发到运行本地跑通只是第一步最终项目需要打包成可独立运行的 Jar 文件。7.1 使用 Maven 打包SpringBoot 项目默认使用spring-boot-maven-plugin进行打包。在项目根目录下执行命令mvn clean package如果一切顺利会在target目录下生成一个demo-0.0.1-SNAPSHOT.jar文件。这个 Jar 包是“可执行”的它内嵌了 Tomcat 服务器。7.2 运行 Jar 包在命令行中进入target目录运行java -jar demo-0.0.1-SNAPSHOT.jar应用会以与在 IDEA 中相同的方式启动。你可以通过--server.port8081参数来修改启动端口java -jar demo-0.0.1-SNAPSHOT.jar --server.port80817.3 生产环境部署考量配置文件分离生产环境的数据库密码、Redis 地址、JWT 密钥等不应写在代码里。可以使用application-prod.properties文件并通过--spring.profiles.activeprod启动参数激活。日志管理配置logback-spring.xml将日志输出到文件并设置合理的滚动策略和级别。进程管理使用systemdLinux、supervisor或 Docker 来管理应用进程实现开机自启、自动重启。数据库连接池确保生产环境使用合适的连接池配置如 HikariCP并设置合理的maximumPoolSize、connectionTimeout等参数。健康检查Spring Boot Actuator 提供了/actuator/health等端点可用于监控应用状态。8. 问题排查清单当项目跑不起来时按照上面的步骤走大部分时候能成功。但如果遇到问题按这个顺序排查能节省大量时间检查环境JDK 版本是否匹配 SpringBoot 3.x17Maven 镜像配置是否正确依赖能否正常下载MySQL、Redis 服务是否已启动检查配置application.properties中的数据库连接 URL、用户名、密码是否正确Redis 主机和端口配置是否正确配置文件语法是否有错误特别是 YAML 的缩进检查依赖pom.xml中的依赖版本是否有冲突可以尝试mvn dependency:tree查看依赖树。是否引入了必要的 Starter如spring-boot-starter-web,spring-boot-starter-data-redis检查注解和扫描主启动类是否在顶层包组件扫描是否能覆盖你的Service,Controller,MapperSpringBootApplication注解是否在主类上MyBatis-Plus 的MapperScan路径是否正确查看日志启动日志仔细阅读控制台输出的错误堆栈信息。SpringBoot 的启动失败信息通常非常详细会直接指出是哪个 Bean 创建失败、哪个配置项有问题。应用日志在application.properties中增加logging.level.rootDEBUG可以输出更详细的日志生产环境请调回 INFO 或 WARN。简化验证如果问题复杂尝试注释掉部分代码或配置回到上一个能正常工作的状态再逐步添加定位问题点。创建一个全新的、最简单的测试接口看基础 Web 功能是否正常以排除是 Web 层还是数据层的问题。学习 SpringBoot看三小时视频是“知道”动手把每个环节打通才是“做到”。我更建议你把环境、配置、代码和问题排查的每一步都自己走一遍遇到报错就去读日志、查文档、搜社区。这个过程积累的经验远比单纯看视频要扎实得多。当你能够独立完成一个包含数据、缓存、安全和文档的完整模块时SpringBoot 的核心开发流程你就已经掌握了。