关于SpringBoot的一些笔记

一:SpringBoot配置的优先级

springboot支持多种格式的配置文件,但是在项目开发时,推荐同意使用一种格式的配置(yml是主流)
优先级:properties>yml>yaml
除了文件属性配置,还有java系统属性(VMoptions)和命令行参数(Program arguments)的方式进行属性配置
优先级:命令行参数>java系统属性>properties配置文件>yml配置文件>yaml配置文件

二:Bean管理(IOC容器中的Bean对象)

作用域 注解配置(@Scope) 核心特点 适用场景
单例(singleton) @Scope("singleton")(默认) IOC 容器中仅创建 1 个实例,所有注入 / 获取都用同一个对象,容器启动时创建(可配懒加载) 无状态的工具类、Service、Mapper这类只有方法啥的类(无成员变量 / 线程安全)
原型(prototype) @Scope("prototype") 每次注入 / 获取 Bean 时新建实例,容器仅负责创建,不管理生命周期(销毁由开发者处理) 有状态的对象(如包含请求专属数据的 VO/POJO)
请求(request) @Scope("request") 每个 HTTP 请求创建 1 个实例,请求结束后销毁 Web 场景中,存储单次请求的专属数据(如请求上下文)
会话(session) @Scope("session") 每个用户会话(Session)创建 1 个实例,会话过期后销毁 Web 场景中,存储用户登录后的会话数据(如用户信息)
应用(application) @Scope("application") 整个 Web 应用(ServletContext)仅 1 个实例,比 singleton 作用域更广(跨容器) Web 场景中,全局应用级数据(如应用配置)
websocket @Scope("websocket") 每个 WebSocket 连接创建 1 个实例 实时通信场景(极少用)

把bean分为无状态的bean和有状态的bean,如果bean中需要存储数据需要共享数据,则是有状态的,如果只有一些方法之类的东西那就是无状态的。有状态的bean不能用单例的,因为有线程安全问题,而无状态的bean应该使用单例默认的,因为性能开销更小。

注意:
如果要配置第三方导入的bean,我们无法在导入的类上添加这些注解,只能单独写 @Configuration 配置类,并写方法创建第三方类实例(配置参数),加 @Bean;之后就可以用 @Autowired 注入使用了。

三:SpringBoot的一些底层原理

1.起步依赖

起步依赖是 “场景化的依赖包集合” —— 把某类开发场景(如 Web 开发、数据库操作、Redis 集成)所需的所有 Jar 包,打包成一个统一的依赖,你只需在 pom.xml/build.gradle 中引入这一个依赖,就能自动获取该场景的所有核心 Jar 包,无需手动逐个导入、解决版本冲突。
springboot的起步依赖是基于maven中的依赖传递

2.自动配置

SpringBoot 自动配置(AutoConfiguration)是 “根据你引入的依赖,自动完成框架组件的配置” —— 不用手动写 XML 配置、不用手动创建核心 Bean(如 Tomcat、DispatcherServlet、数据源),SpringBoot 会通过 “条件判断”,自动识别项目中的依赖,初始化对应组件并注入 IOC 容器,实现 “引入依赖即能用”。

自动配置实现方案一:@Component + @ComponentScan

启动类具备组件扫描功能,但是扫描范围是启动类所在包及其子包,只有这些扫到的@component才会生效。如果有的类不在这个范围内,则要在启动类用@ComponentScan来指定扫描哪个包,注意如果用了这个,默认扫描的范围就不生效了,要自己再加上

自动配置实现方案二:@Import

可以导入一个普通类,导入一个配置类,或者导入ImportSelector接口实现类来实现批量导入
如果第三方包的开发人员定义了注解@EnableXxx来封装@Import注解,那么就可以通过这个注解直接导入

SpringBoot 自动配置源码跟踪核心链路

第一步:

启动类入口 → 核心组合注解 @SpringBootApplication
项目启动类的 @SpringBootApplication 是「组合注解」,核心拆解为 3 个关键注解:
@Configuration:声明启动类本身是配置类,支持写 @Bean 方法;
@ComponentScan:开启组件扫描(默认扫描启动类所在包及子包下的 @Service/@Controller 等注解类);
@EnableAutoConfiguration:自动配置的核心开关(你的核心观察点)。

第二步:

@EnableAutoConfiguration → 封装 @Import 导入批量配置类
@EnableAutoConfiguration 内部封装了 @Import(AutoConfigurationImportSelector.class),其中:
AutoConfigurationImportSelector 是 ImportSelector 接口的实现类;
重写的 selectImports() 方法是核心:返回一个自动配置类全类名数组,这是自动配置的 “数据源”。

第三步:

selectImports() → 读取自动配置类清单(关键补充:配置文件位置)
selectImports() 不会凭空生成类名数组,而是从 SpringBoot 内置的配置文件中读取:✅ 核心文件路径:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(这个文件里列出了所有内置的自动配置类全类名,比如 WebMvcAutoConfiguration、DataSourceAutoConfiguration、RedisAutoConfiguration 等)。

第四步:

加载自动配置类 → 条件判断后注册 Bean(关键补充:不是所有配置类都生效)
读取到的自动配置类不会全部无脑加载,每个配置类都加了 @Conditional 系列注解(如 @ConditionalOnClass/@ConditionalOnMissingBean):
只有满足 “条件”(比如项目中引入了 spring-boot-starter-web 依赖,才会加载 WebMvcAutoConfiguration),配置类才会生效;
生效的配置类中,通过 @Bean 声明的核心组件(如 Tomcat、DispatcherServlet、数据源)会被注册到 IOC 容器。

第五步:

容器初始化完成 → 直接注入使用 Bean
所有满足条件的自动配置 Bean 加载到 IOC 容器后,项目中只需通过 @Autowired 注入(如 @Autowired DataSource dataSource),即可直接使用,无需手动配置。

@Conditional的介绍

@Conditional 是 Spring 实现 “条件化配置” 的核心注解,只有满足注解指定的条件,对应的 Bean / 配置类才会生效—— 这也是 SpringBoot 自动配置 “按需加载” 的底层核心。它的核心逻辑是:条件成立 → 配置生效 / Bean 注册;条件不成立 → 配置跳过 / Bean 不注册。

注解 核心条件(大白话) 典型使用场景
@ConditionalOnClass 类路径下存在指定类(比如引入了对应依赖) 自动配置核心:引入 spring-web 才加载 WebMvc 配置;引入 mybatis 才加载 MyBatis 配置
@ConditionalOnMissingClass 类路径下不存在指定类 兼容旧版本:比如 “没有高版本依赖时,加载低版本适配配置”
@ConditionalOnBean IOC 容器中存在指定 Bean 依赖其他 Bean 时生效:比如 “有 DataSource Bean 才加载 JdbcTemplate 配置”
@ConditionalOnMissingBean IOC 容器中不存在指定 Bean 自动配置兜底:比如 “用户没自定义 RedisTemplate Bean 时,才加载默认的 RedisTemplate”
@ConditionalOnProperty 配置文件(yml/properties)中存在指定属性(可指定属性值) 按配置开关生效:比如 spring.redis.enabled=true 才加载 Redis 配置
@ConditionalOnResource 类路径下存在指定资源文件(如 .properties/.xml) 依赖配置文件时生效:比如 “存在 jdbc.properties 才加载数据源配置”
@ConditionalOnWebApplication 当前项目是 Web 应用(SpringMVC/SpringBoot Web) Web 场景专属配置:比如 Tomcat、DispatcherServlet 仅在 Web 项目中生效
@ConditionalOnNotWebApplication 当前项目不是 Web 应用 非 Web 场景配置:比如纯后台任务项目加载专属 Bean

当加在@bean方法上时,控制该bean是否注册;当加在类上时,控制整个类下的bean是否注册

四:自定义starter

SpringBoot 官方 Starter(如 spring-boot-starter-web)是 “通用场景的依赖 + 配置套餐”,而自定义 Starter 是把你自己项目中可复用的逻辑(如通用工具、第三方接口封装、自定义组件) 封装成 “专属套餐”

流程:
1 写 configuration:配置属性类 → 自动配置类 → 扫描文件 → 打包;
2 写 starter:pom.xml 引入 configuration + 管控版本 → 打包;

posted @ 2025-12-17 00:14  StephZh  阅读(59)  评论(0)    收藏  举报