2023年01月11日 10:40供稿中心:北大青鸟总部
目前微服务已是企业标配,鉴于很多小伙伴还只是停留在知其然,确不知其所以然的情况,这里给大家总结一下SpringBoot的自动装配原理。
后面有些内容老师就是基于SpringBoot这种源码的自动装配原理的来直接写代码的,如果你明白了SpringBoot的自动装配原理,对于后面学习将会更加轻车熟路。
首先对于一个SpringBoot工程来说,最明显的标志的就是@SpringBootApplication它标记了这是一个SpringBoot工程,所以今天的SpringBoot自动装配原理也就是从它开始说起。
首先我们来看下@SpringBootApplication这个注解的背后又有什么玄机呢?
我们按下Ctrl+鼠标左键,轻轻的点一下,此时见证奇迹的时刻...
我们看到如下优雅的代码
这其中有两个比较容易引起我们注意的地方:
一个是@SpringBootConfiguration注解
一个是@EnableAutoConfiguration注解
之所以说这个两个注解比较吸引我们的眼球,是因为其他的注解我们都比较熟悉,即使不知道他们是干什么的,但也可以肯定跟自动装配是没有关系的。
于是我们伸出了邪恶的小手,开启了熟悉的操作,按下了Ctrl +鼠标左键,瞪着色咪咪的小眼睛,瞳孔放大了百倍等待着奇迹的出现...
什么也没有...... 那我要你有何用,这么顶级的世界级的开源项目,怎么会让一个没用的家伙存在呢?于是动用了上亿的脑细胞大军,经过复杂的运算,得出了一个不靠谱的结论它可能使用来标记这是一个SpringBoot工程的配置。
因为SpringBootConfiguration翻译过来就是SpringBoot的配置。
气定神闲之后,秉承着"失败是成功之母"的信念, 熟练的左手行云流水般的按下了Ctrl + Table键,回到了最初的的地方。
眼睛盯着@EnableAutoConfiguration ,环顾左右,在地址栏输入了谷歌翻译,结果显示自动装配。我找的就是你,真是众里寻他千百度,那人却在灯火阑珊处。熟练的按下了Ctrl +左键。
进入了AutoConfigurationImportSelector.class类,因为谷歌翻译告诉我们,这个是自动配置导入选择器。于是我们发现了一片新天地
而这个自动配置的实体AutoConfigurationEntry里面有两个属性,configurations和exclusions。
在后面可以看到getAutoConfigurationEntry()方法返回了一个对象return newAutoConfigurationEntry(configurations, exclusions)这里也就是把我们需要的配置都拿到了。
那这是怎么拿到的候选配置类呢?我们接着看这个获取候选配置类的方法。
进到方法后我们看到下面这个方法具体获取候选配置类的方法内容
这里我们跟着断点去走,首先进入getSpringFactoriesLoaderFactoryClass()方法
接着我们在进入getBeanClassLoader()方法,这里就是一个类加载器
最后我们在进入loadFactoryNames()方法,这个方法就是根据刚才的字节码文件和类加载器来找到候选的配置类。传递过来的字节码
如下图:
最后通过loadSpringFactories()来获取到所有的配置类
这里我们要看下怎么从资源目录下FACTORIES_RESOURCE_LOCATION加载的下面是加载配置文件的路径
也就是项目启动的时候会去加载所有META-INF下的所有的spring.factories文件,我们搜一下这个这个文件,我搭建的是一个最简单的SpringBoot工程,它会去这三个jar里面找相关的配置类。
但是最后自动装配的类是这个spring-boot-autoconfigure-2.1.5.RELEASE.jar
而根据EnableAutoConfiguration.class字节码加载的配置类就只有这118自动配置类
实际上SpringBoot的自动装配原理,其实就是在项目启动的时候去加载META-INF下的spring.factories文件。
当然在启动的过程中还会有其他的配置项的加载,这里咱么主要介绍自动装配的加载过程。希望对大家可以有所启发。
提交成功,感谢您的反馈。
我们会认真阅读和考虑每个用户的反馈。