0.前提: 项目代码
1.项目启动时加载SpringBoot的主配置类SpringBootxxApplication,此类在底层加载了很多springboot带有的bean对象到容器中.具体过程解释如下:
因为此类上配置了@SpringBootApplication注解, 这个注解是一个复合注解或者派生注解
而此注解类上又配置了自动装配功能 @SpringBootConfiguration和@EnableAutoConfiguration
(@EnableAutoConfiguration注解借助@SpringBootApplication被间接的标记在了Spring Boot的启动类SpringBootxxApplication上)
@EnableAutoConfiguration注解的也是一个派生注解. 其中的关键功能由@import 提供其导入的AutoConfigurationImportSelector的selectImports()方法通过来给spring完成自动配置(当运行SpringBoot的启动类时,会运行 SpringApplication.run().在run运行时,这些注解就会生效,就会执行selectImports方法,selectImports方法通过SpringFactoriesLoader.loadFactoryNames()扫描项目的类库中每个jar包,看其是否有META-INF/spring.factories文件. 此文件的内容是一个key多个value<每个value用逗号分隔>. 如果有这样的文件就加载此文件配置的所有类, 并将它们读取到内存, 它们大多数形成实例对象都是需要条件的,如果它们形成了实例对象就把实例对象纳入到spring容器中管理)。
底下是AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()源码调用次序.
比如: spring-boot-autoconfigure-2.3.0.RELEASE.jar里就有一个这样的spring.factories文件。
这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:
注意: 上边的spring.factories文件内的value中的值每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的.
这些条件在每个XxxxAutoConfiguration类上以注解的形式体现, 常见的条件注解有如下几项:
注: 以XxxxAutoConfiguration形式在触发条件时导入一些配置类对象被称作JavaConfig形式.
以ServletWebServerFactoryAutoConfiguration类为例,解释一下全局配置文件中的属性值(比如:server.port=8081)如何生效,(当然不配置也会有默认值,这个默认值来自于org.apache.catalina.startup.Tomcat)。
本类上,有一个@EnableConfigurationProperties注解:作用是开启配置属性,而它后面的参数是一个ServerProperties类,这就是配置的最终落地点。(@EnableConfigurationProperties注解负责将有属性值的ServerProperties对象导入到spring容器中)
而ServerProperties注解用@ConfigurationProperties. 它的作用是从配置文件中读取属性值绑定到对应的bean对象上
而@EnableConfigurationProperties负责导入这个已经绑定了属性值的bean到spring容器中(ServerProperties类与配置文件中以prefix开头的一组键值对是一一对应的)
再次精简解释@ConfigurationProperties和@EnableConfigurationProperties:在全局配置文件中的属性值如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties(例如ServerProperties)一个bean对象上,然后再通过@EnableConfigurationProperties注解将bean对象导入到Spring容器中(在容器中的ServerProperties对象内拥有属性值, 这些数据可以供项目来使用)。
但面试的时候,其实远远不需要回答的这么具体,对于上边这么长的一大段解释只需要这样精简的回答:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类的名字都是以AutoConfiguration结尾的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性值如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
用图片的形式解释上边精简的总结
2.这些XxxxAutoConfiguration类的作用就是自动扫描启动类所在包及其子包中的类,并加载到内存
3.然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service 等)
4.假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例.
(假如此Bean指定了生命周期方法,还会调用生命周期方法<@PostConstruct, @PreDestroy等>)
5.当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构