资讯详情

一文讲解SpringBoot启动流程,包含常见问题解析

📅 2026/9/26 5:11:10 | 华诺云谱 👁 阅读
一文讲解SpringBoot启动流程,包含常见问题解析
1. 配置优先级主流 推荐yml格式的配置SpringBoot 除了支持配置文件属性配置 还支持Java系统属性和命令行参数的方式进行属性配置优先级命令行参数java系统属性yml文件执行maven打包指令package执行java指令运行jar包可以配置Java系统属性和命令行参数java -jar app.jar --server.port80812.bean的管理Bean本质由Spring IOC容器负责创建、管理和维护的Java对象2.1bean的作用域作用域singleton容器内同名称的bean只有一个单例默认prototype每次使用该bean时都会创建新的实例多例request/session/application了解设置bean为多例Scope(prototype)ApplicationContext类IOC容器getBean“获取bean对象Bean什么时候创建Bean对象默认是在项目启动的时候创建的创建完毕后会讲bean放入IOC容器Lazy延迟初始化延迟到第一次使用的时候再来创建这个Bean不同的作用域有不同的作用场景单例的bean适用于无状态的Bean不保存数据多例的bean适用于有状态的Bean保存数据项目开发当中绝大部分的Bean是单例的绝大部分Bean不需要配置scopeSpring容器的bean是线程安全的吗无状态的bean是线程安全的因为不存在数据共享的问题有状态的bean多个线程操作bean时有可能出现线程安全问题2.2第三方Bean对于自己实现的类可以通过注解Component声明这是一个bean对象对于第三方库的类不能去源码中添加注解通过Bean注解声明一个方法Bean方法通常写在配置类Config中通常写在 Configuration 配置类中返回值 bean类型方法名默认就是 Bean 名称方法返回的对象 IOC 容器管理的对象默认是单例 Bean模板Configuration public class XxxConfig { Bean public Xxx xxx() { return new Xxx(); } }3.SpringBoot自动配置原理起步依赖的原理就是Maven的依赖自动配置SpirngBoot的自动配置就是当spring详谬启动后一些配置类、bean对象就自动存入了IOC容器中不需要我们手动声明从而简化开发省区繁琐的配置操作3.1自动配置实现方案SpringBootApplication具备组件扫描的功能但是扫描的时启动类所在的包及其子包方案一ComponentScan在启动类上添加设置扫描范围适用于第三方提供的依赖ComponentScan(baseOackages {包名1,包名2...})方案二Import导入可以把 Spring 默认扫描不到的类主动导入 IOC 容器体系相当于告诉Spring这个类你也给我加载导入形式普通类配置类ImportSelector接口实现类批量导入需要自己手动实现ImportSelector接口//普通类 配置类 Import(类名.class) //ImportSelector接口实现类 Import(MyImportSelector.class)ComponentScan → 自己去包里找 Import → 我直接把类告诉Spring方案三第三方类的开发者会讲Import注解进行封装提供注解EnableXxxx直接导入3.2 源码跟踪启动类注解SpringBootApplication源码有三个核心组成SpringBootConfiguration注解这个注解里面有Configuration所以启动类本质是一个配置类所以可以在启动类中声明第三方的BeanComponentScan组件扫描默认扫描当前引导类所在包及其子包EnableAutoConfigurationSpringBoot实现自动化配置的核心注解通过自动配置导入机制获取候选“自动配置类”的全类名并将这些自动配置类导入 Spring。Spring 随后解析这些配置类根据Conditional系列注解判断配置是否满足条件满足条件后执行其中的Bean方法将创建出来的 Bean 注册到 IOC 容器中Enable开头的注解底层一般都会封装Import注解Import(AutoConfigurationImportSelector.class)AutoConfigurationImportSelector中实现了selectImports**返回值String[]数组封装了需要导入到IOC中的类的自动配置类的类名public String[] selectImports(AnnotationMetadata annotationMetadata)String[]数组中的类名来源于该文件META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中保存了很多自动配置类名这些都是配置类中都声明了一个一个的Bean对象这些Bean对象不会全部加载到IOC容器上会根据Condiitional条件判断是否满足自己自定义自动配置类也是将自动配置类配置在这个文件中完整的自动配置流程SpringBoot启动 ↓ SpringBootApplication ↓ EnableAutoConfiguration ↓ Import(...) ↓ 找到 AutoConfiguration.imports ↓ 得到一批“自动配置类” ↓ 把这些自动配置类导入 Spring ↓ Spring解析这些配置类 ↓ 检查 Conditional 条件 ↓ 条件满足 ↓ 执行里面的 Bean 方法 ↓ 创建Bean ↓ 放入IOC容器3.3Conditional作用根据指定条件判断满足条件后才注册 Bean位置方法、类Conditional本身是一个父注解派生出大量的子注解ConditionalOnClassclasspath 中存在这个类时配置才生效才注册bean到IOC容器ConditionOnMissingBeanIOC 中没有这个 Bean我才创建ConditionalOnProperty判断yml配置文件中有对应的属性和值才会注册到IOC容器中ConditionalOnClass(name Xxx.class) ConditionalOnMissingBean //判断yml配置文件中 name值是否为ccy ConditionalOnProperty(namemyname,havingValueccy)3.4自定义starterstarter 依赖管理 autoconfigure Bean自动配置在实际开发中经常会自定义一些公共组件提供给各个项目团队使用。而在SpringBoot的项目中一般会将这些公共组件封装为SpringBoot的starter博阿寒起步依赖和自动配置的功能案例自定义aliyun-oss-spring-boot-starter完成阿里云OSS操作工具类 AliyunOSSOperator的自动配置目标引入起步依赖之后要想使用阿里云OSS注入AliyunOSSOperator 直接使用即可步骤创建aliyun-oss-spring-boot-starter模块创建aliyun-oss-spring-boot-autoconfigure模块在starter中引入该模块在aliyun-oss-spring-bootautoconfigure模块中的定义自动配置功能并定义自动配置文件 META-INF/spring/xxxxx.imports4.常见问题Q1 IOC DI答IOC对象创建和管理的控制权交给SpringDISpring创建Bean之后把Bean所依赖的其他Bean注入进去IOC 是思想DI 是 IOC 的主要实现方式Q2Component 和 Bean的核心区别Component和Bean都可以把对象交给 Spring IOC 容器管理。Component是类级别注解通常通过组件扫描发现由 Spring 负责创建该类的对象适合自己编写的业务类Bean是方法级别注解Spring 会执行被Bean标注的方法并把方法返回值注册到 IOC 容器中因此更适合第三方类或者需要自定义对象创建、初始化过程的场景。Component更偏向“声明这个类由 Spring 管理”Bean更偏向“我负责创建对象Spring 负责管理对象”。Controller、Service、Repository本质上都是基于Component的语义化注解Q3Spring Boot 自动配置原理是什么答Spring Boot 启动类上的SpringBootApplication中包含EnableAutoConfiguration用于开启自动配置。EnableAutoConfiguration会通过Import机制加载自动配置相关组件并读取AutoConfiguration.imports中声明的候选自动配置类。Spring 会解析这些自动配置类并根据ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnProperty等条件注解判断当前环境是否满足配置条件。如果条件满足就会执行自动配置类中相应的Bean方法创建 Bean 并注册到 IOC 容器从而实现自动配置。流程SpringBootApplication ↓ EnableAutoConfiguration ↓ 通过 Import 导入自动配置相关组件 ↓ 读取 AutoConfiguration.imports ↓ 获得候选自动配置类 ↓ Spring 解析这些自动配置类 ↓ Conditional 判断是否满足条件 ↓ 满足条件后执行其中的 Bean 方法 ↓ 创建 Bean 并注册到 IOC 容器Q4SpringBootApplication有什么作用答它是 Spring Boot 的核心组合注解主要包含配置类、组件扫描和开启自动配置三个功能。启动类本身是一个配置类默认扫描启动类所在包及其子包同时开启 Spring Boot 自动配置。Q5为什么启动类一般放在项目最外层包答因为SpringBootApplication默认会扫描启动类所在包及其子包。放在最外层包可以确保 Controller、Service、Mapper、Component 等组件都能够被扫描到。Q6什么是 IOCIOC 是控制反转本来对象由程序员自己newSpring 中把对象的创建和管理交给 IOC 容器。Q7什么是 DIDI 是依赖注入。当一个 Bean 依赖另外一个 Bean 时Spring 从 IOC 容器中找到对应对象并注入进去。Q9Spring Bean 默认是单例吗是。默认作用域是 singleton在同一个 IOC 容器中同名称 Bean 通常只有一个实例。Q10单例 Bean 一定线程安全吗这题很容易挖坑。不要答Spring单例Bean是线程安全的。应该答不一定。如果 Bean 是无状态的没有可变共享成员变量一般不会产生共享数据竞争如果 Bean 保存了可变状态多线程同时操作时就可能产生线程安全问题。Q11ConditionalOnMissingBean有什么作用当 IOC 容器中不存在指定 Bean 时才注册当前 Bean因此 Spring Boot 可以提供默认配置同时允许开发者自定义 Bean 覆盖默认配置。Q12Starter 是什么Starter 本质上是一组依赖的封装。开发者只需要引入一个 Starter就可以一次性获得某项功能需要的一组依赖配合自动配置机制还可以自动创建相关 Bean。Q13Starter 和自动配置有什么区别这题你最好会。Starter → 解决“需要引入哪些依赖” 自动配置 → 解决“这些组件应该怎么配置成Bean”Q14Import有什么作用用来将类主动导入 Spring 容器体系可以导入普通类、配置类以及 ImportSelector 等。Spring Boot 的自动配置机制中也大量利用了 Import 思想。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑