SpringBoot自动装配-源码分析
1. 简介
通过源码探究SpringBoot的自动装配功能。
2. 核心代码
2.1 启动类
我们都知道SpringBoot项目创建好后,会自动生成一个当前模块的启动类。如下:
2.2 @SpringBootApplication
在启动类中有个很重要的注解@SpringBootApplication
,在该注解中除了元注解,就是@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
- @SpringBootConfiguration:标识了当前类为配置类
- @ComponentScan:配置类的组件扫描
- @EnableAutoConfiguration:激活自动装配
2.3 @EnableAutoConfiguration
这里我们重点看@EnableAutoConfiguration
注解。
在该注解中我们看到了熟悉的@Import
注解,并且该注解指定导入了AutoConfigurationImportSelector.class
2.4 AutoConfigurationImportSelector
我们进入到AutoConfigurationImportSelector.class
,看到当前类继承自DeferredImportSelector
接口,而通过查看DeferredImportSelector
源码 public interface DeferredImportSelector extends ImportSelector {}
得知,DeferredImportSelector
继承自ImportSelector
接口。因此我们大概得知SpringBoot默认装载了ImportSelector::selectImports()
方法返回的全限类名数组。
2.5 SpringFactoriesLoader
为了验证配置信息是不是从META-INF/spring.factories
获取的,我们继续跟踪源码SpringFactoriesLoader::loadFactoryNames()
在这里为了更方便的查看loadSpringFactories
中各步骤是用来干嘛的,特意添加debug截图如下:
2.6 spring.factories
spring-boot-autoconfigure
下的META-INF/spring.factories
文件信息
从上图中我们能看出spring.factories 中指定了很多常用中间件的auto configure
文件信息。
2.7 RedisAutoConfiguration
我们仅查看我们比较熟悉的redis中间件的autoconfiguration文件信息
从RedisAutoConfiguration
源码中我们能看出在文件中使用很多的@Conditional
注解来实现注入符合条件的SpringBean
3. 小结
至此我们大概了解了SpringBoot是如何实现自动装配的。
- 项目启动
- 通过启动类上的
@SpringBootApplication
注解加载@EnableAutoConfiguration注解 - 通过
@EnableAutoConfiguration
加载@Import(AutoConfigurationImportSelector.class)
执行AutoConfigurationImportSelector
导入选择器 - 在
AutoConfigurationImportSelector
中执行selectImports()
方法 AutoConfigurationImportSelector::selectImports()
通过加载ClassPath下的META-INF/spring.factories
文件来动态的注入*AutoConfiguration类- *AutoConfiguration类中通过使用
@Conditional
注解及其派生注解实现了Bean的灵活装载。
__EOF__

本文链接:https://www.cnblogs.com/ludangxin/p/15092237.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示