spring boot 学习之路-1.0

spring boot 是spring 的升级版?这明显是不对的。下面直接上干货。

SpringBoot 核心考点 + 三大框架区别:

Spring、Spring 与 SpringBoot 核心区别、SpringCloud 与 SpringBoot 核心区别?

一、SpringBoot 常考内容(核心)

SpringBoot 不考偏门细节 ,聚焦原理、核心特性、实战应用,以下是必问考点:

1. 基础概念

  • 什么是 SpringBoot?核心特性有哪些?

答:SpringBoot 是简化 Spring 应用开发的脚手架 ,核心特性:自动配置、起步依赖、内嵌容器、零XML配置、开箱即用

  • SpringBoot 的优点?

简化配置、解决依赖冲突、快速开发、内嵌服务器、适配微服务。

2. 自动配置原理(考点)

  • @SpringBootApplication 注解拆解:

由 @SpringBootConfiguration(配置类)、@EnableAutoConfiguration(开启自动配置)、@ComponentScan(包扫描)三个核心注解组成。

  • 自动配置流程:

SpringBoot 启动时,通过 @EnableAutoConfiguration 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加载自动配置类,结合 @Conditional 系列条件注解,按需自动配置Bean,无需手动编写。

3. 起步依赖 Starter

  • 什么是 Starter?

Starter 是依赖整合封装 ,一个 Starter 包含当前场景所有依赖+版本控制,无需手动导包、解决版本冲突(如 spring-boot-starter-web 整合了SpringMVC、Tomcat等所有Web依赖)。

  • Starter 原理:Maven 依赖传递 + 自动配置。

4. 启动流程

SpringApplication.run() 核心步骤:

  1. 初始化 SpringApplication 对象;
  2. 配置应用启动环境(配置文件、环境变量);
  3. 创建 Spring 容器;
  4. 执行自动配置、加载Bean;
  5. 刷新容器,启动内嵌服务器(Tomcat/Jetty);
  6. 应用启动完成。

5. 配置相关

application.yml / properties区别?

答:核心是语法格式、可读性和扩展性的区别,重点记3点:

语法格式:properties= 赋值,层级用 . 分隔(如 spring.datasource.url=);

yml: 赋值,层级用缩进(空格)区分,更简洁;

  • 可读性:yml 层级清晰,适合复杂配置(如微服务多环境配置);properties 语法简单,适合简单配置;

  • 扩展性:yml 支持数组、集合、对象嵌套,properties 不支持直接嵌套,需通过下标区分(如 user[0].name=)。

配置文件优先级(命令行 > 外部配置 > 内部配置 > 默认配置);

  • 多环境切换(spring.profiles.active);

@Value@ConfigurationProperties 区别?

答:面试高频追问,核心区别从5个维度记忆,贴合实战场景:注入方式:@Value 只能单个注入(如 @Value("${spring.datasource.url}"));@ConfigurationProperties 可批量注入指定前缀的配置(如前缀 spring.datasource,自动注入url、username等所有相关配置);

  • 类型转换:@Value 需手动指定类型转换(如日期、数组),否则为字符串;@ConfigurationProperties 自动完成类型转换,无需手动处理;

  • 校验支持:@Value 不支持JSR380校验(如 @NotNull@Min);@ConfigurationProperties 可结合 @Validated 实现配置校验;

  • 松散绑定:@Value 不支持松散绑定(如配置文件写 spring.datasource.user-name,注解中必须完全匹配);@ConfigurationProperties 支持(可写 userName 匹配配置文件的 user-name);

  • 适用场景:@Value 适合单个、简单配置注入;@ConfigurationProperties 适合批量、复杂配置(如数据源、自定义配置类)。

6. 内嵌容器

  • 支持的容器:Tomcat(默认)、Jetty、Undertow;
  • 如何切换内嵌容器?排除默认Tomcat依赖,引入对应容器依赖。

7. 注解 & 实战功能

  • 全局异常处理:@RestControllerAdvice + @ExceptionHandler;
  • 异步任务:@EnableAsync + @Async;
  • 打包部署:FatJar(可执行Jar包),java -jar 直接运行;
  • 监控:Actuator 端点、SpringBoot Admin;
  • 跨域解决方案、事务管理。

8. Spring 中 Bean 的生命周期

Bean 的生命周期是 Spring 核心基础,必问,核心分为4大阶段,全程由 Spring 容器管理:

实例化(Instantiation):Spring 容器通过反射创建 Bean 实例(无参构造器),此时 Bean 仅为一个空对象,未设置任何属性;

属性注入(Populate) :Spring 容器将配置好的属性(依赖)注入到 Bean 实例中,完成依赖装配(如 @Autowired 注入);

初始化(Initialization) :Bean 实例化+属性注入后,执行初始化逻辑:

  • 执行 BeanNameAware、ApplicationContextAware 等Aware接口方法(获取容器相关信息);
  • 执行 @PostConstruct 注解标注的方法(初始化前置);
  • 执行 InitializingBean 接口的 afterPropertiesSet() 方法;
  • 执行配置文件中 init-method 指定的自定义初始化方法;

销毁(Destruction) :Spring 容器关闭时,执行销毁逻辑:

  • 执行 @PreDestroy 注解标注的方法(销毁前置);
  • 执行 DisposableBean 接口的 destroy() 方法;
  • 执行配置文件中 destroy-method 指定的自定义销毁方法;

总结:实例化 → 属性注入 → 初始化 → 销毁(核心记忆点:空对象→填属性→做初始化→最后销毁)。

9. Spring 三级缓存(重点)

三级缓存是什么?(核心定义) Spring 三级缓存是 Spring 容器为了解决Bean 循环依赖(如 A 依赖 B,B 依赖 A)而设计的缓存机制,本质是三个 Map,按优先级从高到低(一级→三级):

  1. 一级缓存(单例池):singletonObjects,存储完全初始化完成的单例 Bean,直接供外部使用;
  2. 二级缓存(早期暴露对象):earlySingletonObjects,存储实例化完成、未完成属性注入和初始化的单例 Bean,用于临时暴露,解决循环依赖;
  3. 三级缓存(对象工厂):singletonFactories,存储Bean 工厂对象(用于创建 Bean 实例的工厂),延迟创建 Bean 实例,避免提前初始化。

为什么二级缓存不行?(核心追问) 核心原因:无法解决"带代理的 Bean 循环依赖",具体逻辑如下:总结:二级缓存只能存储"固定对象",无法处理代理对象的延迟创建;三级缓存通过工厂延迟生成代理对象,既解决循环依赖,又保证代理功能正常。

  • Spring 中有些 Bean 需要生成代理对象(如 AOP 增强),代理对象的创建是在 Bean 初始化阶段完成的(而非实例化阶段);
  • 若只有二级缓存,当出现循环依赖时,只能暴露"未初始化的原始 Bean",而原始 Bean 还未生成代理对象,此时注入的是原始 Bean,而非代理 Bean,会导致代理失效;
  • 三级缓存的工厂对象(singletonFactories)可以延迟创建代理对象:当循环依赖发生时,通过工厂先获取"早期暴露的原始 Bean",在初始化阶段完成代理创建后,再将代理对象放入二级缓存,最终放入一级缓存,确保注入的是代理 Bean,保证 AOP 增强生效。

二、Spring 与 SpringBoot 的核心区别

关键纠正

SpringBoot 绝对不是 Spring 的升级版!

  • Spring(Spring Framework):是Java 开发的核心底层框架,提供 IOC、AOP、事务、SpringMVC 等核心能力;
  • SpringBoot:是基于 Spring 生态的快速开发脚手架,目的是简化 Spring 应用的开发、配置、部署。

|------|-----------------------|-------------------------|
| 对比维度 | Spring (Framework) | SpringBoot |
| 核心定位 | 底层核心框架(提供基础能力) | 快速开发脚手架(简化Spring使用) |
| 配置方式 | 繁琐:XML配置 + JavaConfig | 极简:自动配置,零XML |
| 依赖管理 | 手动导包,易出现版本冲突 | Starter起步依赖,自动管理版本 |
| 服务器 | 必须手动配置外部Tomcat | 内嵌Tomcat/Jetty,直接运行 |
| 开发效率 | 低,配置量大、搭建工程慢 | 高,开箱即用,几分钟搭建项目 |
| 部署方式 | 打War包,部署到外部服务器 | 打FatJar包,java -jar 一键运行 |
| 适用场景 | 所有Java企业级开发(底层支撑) | 快速构建单体应用、微服务应用 |

三、SpringCloud 与 SpringBoot 的核心区别

核心结论

两者定位完全不同,是互补关系,不是替代关系

  1. SpringBoot:开发单个应用的工具(单体/微服务单个服务);
  2. SpringCloud:微服务架构的整套解决方案(治理多个微服务);
  3. 依赖关系:SpringCloud 必须基于 SpringBoot 构建

|------|-----------------------|----------------------------------------------------------|
| 对比维度 | SpringBoot | SpringCloud |
| 核心定位 | 单个应用的快速开发框架 | 分布式微服务的治理生态 |
| 解决问题 | 简化单个Spring应用的配置、依赖、部署 | 解决微服务集群的:注册发现、配置中心、服务网关、熔断降级、链路追踪等 |
| 依赖关系 | 可独立使用 | 必须依赖 SpringBoot |
| 核心组件 | 自动配置、Starter、内嵌容器 | Nacos/Eureka(注册中心)、Gateway(网关)、Sentinel(熔断)、Feign(远程调用)等 |
| 使用场景 | 单体应用、微服务中的单个服务 | 微服务集群、分布式系统 |

总结

  1. Spring:底层核心,提供 IOC/AOP 等基础能力;
  2. SpringBoot :基于 Spring,快速开发单个应用
  3. SpringCloud :基于 SpringBoot,微服务分布式治理
  4. 三者关系:Spring → SpringBoot(简化开发)→ SpringCloud(微服务生态)
相关推荐
Flittly5 小时前
【SpringAIAlibaba新手村系列】(18)Agent 智能体与今日菜单应用
java·spring boot·agent
树獭叔叔5 小时前
Claude Code Skill 系统:懒加载的 Agent 行动说明
后端·aigc·openai
Nexzk5 小时前
我把 Hermes Agent 源码扒了个底朝天:它不是“又一个 AI Agent”,而是在认真造一套代理操作系统
后端
袋鱼不重5 小时前
Hermes Agent 安装与实战:从安装到与 OpenClaw 全方位对比
前端·后端·ai编程
写Cpp的小黑黑5 小时前
C++ std::shared_ptr 线程安全性和最佳实践详解
后端
沸点小助手5 小时前
「 AI 整活大赛,正式开擂 & 最近一次面试被问麻了吗」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能·后端
何陋轩6 小时前
消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
redis·后端
东京老树根6 小时前
SAP学习笔记 - BTP SAP Build02 - Deploy,开始URL,Approve,Reject,履历确认,Log,Context
笔记·学习
青Cheng序员石头6 小时前
龙虾运行时安全部署 | NVIDIA NemoClaw 深度研究报告
后端·aigc·nvidia