SpringBoot 从注解到源码:核心知识点总结

一、SpringBoot常用注解

容器相关

@SpringBootApplication:启动类复合注解;

@Component/@Service/@Controller/@Repository:注册 Bean;

@Bean:方法注册 Bean;

@Autowired:依赖注入。

Web 接口

@RestController = @Controller + @ResponseBody

  • @Controller:标识这是控制器,交给 Spring 管理
  • @ResponseBody:方法返回值直接作为 JSON 响应体,不会跳转页面

@GetMapping:用来接收 GET 请求;

也可以用@RequestMapping("/user/add",method = RequestMethod.POST)用来接收 GET 请求

@PostMapping:用来接收 POST 请求;

@RequestBody:接收 JSON;

@RequestParam:接收普通表单 /url 参数;

@PathVariable:路径参数。

配置文件读取

@Value@ConfigurationPropertie

复制代码
user:
  name: 张三
  age: 20

@Component
public class TestConfig {
    // 读取单个零散配置
    @Value("${user.name}")
    private String userName;

    @Value("${user.age}")
    private Integer age;
}

@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserProp {
    private String name;
    private Integer age;
}

二、SpringBoot 写一个 HTTP 接口完整流程

  1. 创建类,加上@RestController
  2. 编写方法,添加@GetMapping/@PostMapping指定路径;
  3. 定义参数注解接收前端数据;
  4. 编写业务逻辑,返回结果;
  5. 启动项目,通过地址访问接口。

Spring 的数据库连接池

SpringBoot 默认使用HikariCP作为数据库连接池。

作用:提前创建一批数据库连接放到池子里,程序操作数据库时直接取用,用完归还,避免频繁创建销毁连接,提升性能。

核心参数:最大连接数、最小空闲连接、超时时间。

三、SpringBoot 区分多环境配置

采用多环境配置文件

application-dev.yml 开发环境

application-test.yml 测试环境

application-prod.yml 生产环境

在主配置文件 application.yml 通过 spring.profiles.active=dev 指定激活哪个环境; 启动时也可以命令行参数指定环境。 公共配置放主文件,各个环境独有的配置写在对应环境文件。

四、Spring Bean 和 Java Bean 的区别

  1. Java Bean 普通 Java 规范:私有成员变量、get/set 方法、无参构造;只是一个标准实体类,单纯用来存数据。

  2. Spring Bean 交给 Spring IoC 容器管理的对象。 容器负责创建、依赖注入、生命周期管理,可以是 Service、Controller、Mapper 等任意对象,不强制遵守 JavaBean 规范

五、循环依赖-三级缓存

什么是循环依赖

简单说,就是 A 对象依赖 B 对象,B 对象又依赖 A 对象,类似的代码如下:

复制代码
@Component
public class A{
    @Autowired
    private B b;
}
@Component
public class B{
    @Autowired
    private A a;
}

其他还有很多种方式,如 A 依赖 B,B 依赖 C,C 依赖 A,或是 A 依赖 A 自己,只要产生了依赖关系的闭环,即造成了循环依赖。

三级缓存解决循环依赖

  • 创建 A,执行构造方法实例化;
  • 将 A 的 ObjectFactory 对象工厂接口)放入三级缓存
  • 填充 A 的属性,发现需要 B;
  • 开始创建 B;
  • B 填充属性,发现需要 A;
  • 去一级缓存找 A → 没有;去二级缓存找 A → 没有;去三级缓存找到 A 的工厂;
  • 调用工厂拿到 A 半成品,放入二级缓存,同时删除三级缓存里面 A 的工厂;
  • 将 A 注入 B,B 完成创建,放入一级缓存;
  • 回到 A,把 B 注入 A,A 创建完成,移入一级缓存

为什么需要第三级缓存?

核心:为支持 AOP 动态代理 如果只有二级缓存,拿到的永远是原始对象; 三级缓存的ObjectFactory,可以在循环依赖触发时,判断是否需要生成代理对象,向外暴露代理 Bean。 没有三级缓存,循环依赖场景下无法正确返回代理对象。

通俗总结:二级缓存只能存原始对象;三级缓存工厂具备能力,按需生成代理。

Spring3.6 之前如何解决循环依赖

在 Spring 3.6 之前,Spring 通过使用一级和二级缓存来解决单例 Bean 的循环依赖问题,而从 3.6 版本开始,通过引入三级缓存,Spring 能够更全面地处理包括 AOP 在内的更复杂的循环依赖情况。

六、Spring MVC流程

简单叙述

1.request携带 url 进入 DispatcherServlet

2.查找hander得到处理器,根据处理器获得适配器

3.适配器执行controller方法,返回ModelAndView

4.解析视图

5.视图渲染返回

具体过程及源代码

  1. request 携带 url 进入 DispatcherServlet
  2. 调用 getHandler () 通过 HandlerMapping 查找处理器执行链;再调用 getHandlerAdapter (),根据处理器匹配对应的适配器
  3. 适配器执行 Controller 方法,返回 ModelAndView
  4. 视图解析器解析视图名称
  5. 视图渲染,最终响应返回浏览器
相关推荐
坚定信念,勇往无前2 小时前
Maven 私有仓库-nexus
java
Minner-Scrapy2 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
晚风醉蝶2 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
陈随易2 小时前
Bun v1.4 更新总结:把浏览器、图片、定时任务和工程工具都装进一个运行时
前端·后端·程序员
夏天拐跑了西瓜2 小时前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
2601_967264283 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习
人间凡尔赛3 小时前
2026 后端架构三驾马车:Wasm 容器上 K8s、存算分离与 AI 原生
后端·云原生·架构
m0_587383003 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林3 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n