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. 视图渲染,最终响应返回浏览器
相关推荐
zhanghaha131421 分钟前
HTML系列教程:14_HTML 表单与输入框 <form>、<input> 零基础详解
java·前端·javascript
yxlalm6 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风6 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
码事漫谈7 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
Seoyoneh7 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人7 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr7 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
考虑考虑7 小时前
docker compose环境变量替换
运维·后端·自动化运维
彧azz8 小时前
Java学习语法篇:变量
java·学习