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 思想。
企业数字化 ERP 产品动态
相关推荐
SpringBoot+Vue+MyBatis+MySQL服装生产管理系统实战拆解 做服装行业的系统,和做电商、做社交完全是两种体验。接触过生产制造类管理系统的朋友应该都有这种感觉:业务部门的需求永远在变,今天加一个面料色号,明天又要按尺码拆分订单,数据关系绕来绕去,比单纯写业务… · 2026/9/26 5:10:50
MATLAB R2025b废止SPS库:Simscape Electrical迁移实战指南 1. 这不是Bug,是MathWorks一次彻底的架构升级“MATLAB R2025b中消失的Specialized Power Systems库”——这句话在电力电子、电机驱动、新能源并网仿真圈子里,最近三个月几乎成了高频搜索词。我每天在高校实验室、风电变流器厂商的技术支持群、以及几个老… · 2026/9/26 5:10:50
计算机网络应用层复习:DNS与HTTP核心考点全解析 期末复习计算机网络,走到第2章应用层这里,很多人的状态其实很微妙:既觉得它比前三章好懂——毕竟“HTTP、DNS、FTP”这些名字在日常生活中都听过;又觉得它碎得离谱——协议一堆、端口一堆、状态码一堆,真到做题时经常张… · 2026/9/26 5:10:50
如何筛选靠谱的SEO服务商:从关键词排名到可持续流量资产 1. 先想清楚一件事:你需要的不是“SEO公司”,而是能算清账的优化服务做SEO推广咨询的人经常被一句话噎住:“你们到底能不能保证排名?”每次听到这个问题,我都想说一句可能不太讨喜的话:如果一家SEO公司开口… · 2026/9/26 20:25:42
Maven Could not find artifact 根因解析与诊断指南 1. 这不是报错,是Maven在向你“喊话”:它真的找不到那个jar包“Could not find artifact”——这行红字,几乎每个用Maven做过Java项目的人都见过。它不像NullPointerException那样直白地告诉你“空指针”,也不像ClassNotFoundExce… · 2026/9/26 20:25:35
泛癌种视角下的KRAS G12C突变分析与蛋白降解剂研发 如果只看单个癌种的测序报告,你可能会觉得KRAS G12C也就是肺腺癌里的一个小分型,量不大,事不多。可一旦把镜头拉到泛癌种维度,情况就完全不是这样——结直肠、胰腺、胆管、甚至部分妇科肿瘤都能见到携带者;更关键的是&… · 2026/9/26 20:25:29
GitHub热榜解读:Office SDK、CLI化与Agent沙箱三大技术主线 1. 这期热榜为什么值得单独聊一聊9 月 24 日这期 GitHub 热榜里,Office SDK、CLI 化工具链、Agent 运行沙箱这三类项目扎堆出现,不是巧合。我翻了一圈榜单和最近社区里的讨论,发现一个很明显的信号:Agent 正在从"能跑起来&qu… · 2026/9/26 20:25:29
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46