Spring boot 到底是如何实现自动装配的

1,688 阅读2分钟

Spring boot 相信各位小伙伴都不是很陌生,是现在大家在开发过程中用到频率比较多的框架,当然也是在面试过程中问的比较多的一个技术点。

我在以往的面试过程中就被问到很多次,也在以往的工作开发中多次使用这个框架来配合微服务的使用,理解最多的也就是通过main方法来使项目到运行状态,但对其原理还不是很清楚,今天我们就来深度分析下Spring boot到底是如何实现自动装配的,如有分析不对的地方希望大家给予指正🙏

首先我在项目中使用的Spring boo 版本是2.2.6.RELEASE

27C3E463-0F2E-4DB0-8448-49DE87411FFD.png

下面来看项目的启动方法

0A554109-DFD6-4F71-9361-E49271F4F2B8.png

@SpringBootApplication

进入注解后会发现原来就是个Configuration配置类啊,会有3个核心注解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

10762D86-3387-4C1A-AAE7-2D9AF0FDA88C.png

@ComponentScan

其中ComponentScan会扫描我们项目,Spring Boot主启动类的同级路径及子路径,主要就是扫描以下框出的部分。

B8BE57B5-42A3-481D-8345-FD39F2F672B0.png

@EnableAutoConfiguration

下面我们来说最核心的注解@EnableAutoConfiguration,这个是Spring Boot实现自动装配最核心的注解。

8B1A5881-0C1E-405F-A5E5-18B7394BE191.png

我们可以看到它通过@Import注解,注入了一个AutoConfigurationImportSelector的类,selectImports() 方法那么它返回了一个String的数组,这个数组就是来接受我们所需要装配的类。

FD0BF755-0EDD-4618-84D2-B532EBF31579.png

继续看方法里面的代码发现getAutoConfigurationEntry()方法返回了AutoConfigurationEntry对象,这个类里面就是保存着我们的配置信息。 Configurations是我们的配置文件,其中入参还有Annotation(注解),看来我们的装配确实跟注解关系。

A891F73F-786E-477F-90EC-FDEE81AF3063.png 因为getCandidateConfigurations()这个方法返回了一个list集合的Configurations,所以我们要点进去看下这个方法到底做了些什么。

6E480A36-62EF-4FE0-AAB5-A8CCB4D40318.png 我们看到了loadFactoryNames()这个方法,那么这个方法一定帮助我们加载配置类的方法了。

A59D1AD6-EA94-4388-A266-141BB71A5096.png loadSpringFactories()这个方法可以清楚的看到,先去本地缓存中拿需要加载的配置,如果缓存中有直接返回配置信息,如果cache里面没有再去我们META-INF/spring.factories目录下去拿到需要加载的配置类,通过ClassLoader类加载器进行加载。

D66C9057-D39A-408B-A4A3-51B95DC4AC5B.png 我们进入jar包可以看到META-INF目录下的spring.factories文件第一行就是EnableAutoConfiguration这个注解。

最后总结

Spring Boot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件然后加载bean定义的过程,通过自动装配极大地简化了开发的流程。