SpringBoot自动装配原理

SpringBoot自动装配原理

首先大家都知道SpringBoot给我们带来的好处,简化配置、自动装配
路人A:你知道SpringBoot有什么好处吗?
路人B:自动化配置!!!
路人A:那你知道SpringBoot怎么去实现自动化的吗?
路人B:那要知道干啥,好用就行了!

这样肯定是不对的,作为一名合格的码农,最基本的要知道自己码的是啥

闲话不多说开始,大家都知道一个简单的SpringBoot启动类
SpringBoot自动装配原理
@SpringBootApplication 必不可少的,首先看下@SpringBootApplication里面有些什么东西
SpringBoot自动装配原理

看出来了吧,@SpringBootApplication 主要是由

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

三大注解组成,@EnableAutoConfiguration:开启自动配置,没错就是它了,那可以知道自动装配是由@EnableAutoConfiguration去实现的。
ok,继续往下看,两个核心注解,其他注解自行了解

SpringBoot自动装配原理

  • @AutoConfigurationPackage:自动配置包
    可以发现@AutoConfigurationPackage:自动配置包,乍一看感觉是用来扫描包的,事实也确实是这样,进入源码看一下发现引入了一个AutoConfigurationPackages.Registrar.class类,进入搜索PackageImports找到这个静态内部类,通过AnnotationMetadata限定以类名的形式去找到启动类所在的包,扫描同级包下所有可装配的Bean
    SpringBoot自动装配原理看到这里瞬间就懂了@AutoConfigurationPackage是怎么去完成自动对package扫描的了,启动时调用PackageImports构造方法完成对包的扫描。

  • @Import(AutoConfigurationImportSelector.class):导入组件
    @EnableAutoConfiguration的@Import注解,引入了AutoConfigurationImportSelector.class类,继续往下看
    SpringBoot自动装配原理

SpringBoot自动装配原理

一进去又看到了自动装配,既然是解析自动装配的原理,当然首先是看这个了,看下这个AutoConfigurationEntry属性是干什么用的,怎么找,万能的搜索功能(在这里就体现出了代码规范的好处)

搜索EMPTY_ENTRY发现有一个getAutoConfigurationEntry(AnnotationMetadata annotationMetadata):获取自动装配条数,讲的有点多了,感兴趣的小伙伴可以直接debug去看下这个方法其他代码,我这里只讲一些主要的,找到getCandidateConfigurations()下的loadFactoryNames()方法看一下,发现它获取到’META-INF’目录下的spring.factories文件内容

SpringBoot自动装配原理

SpringBoot自动装配原理

并且获取里面的数据把每一条都保存到一个集合中,也就是说在类启动时会去加载spring.factories中的内容,讲到这里大家是不是又多了一种BUG排除思路呢

SpringBoot自动装配原理图片来源 作者:vbirdbest

记录每天一小步,不是很详细如果有哪里不对的地方可以论一论