Spring boot 相信各位小伙伴都不是很陌生,是现在大家在开发过程中用到频率比较多的框架,当然也是在面试过程中问的比较多的一个技术点。
我在以往的面试过程中就被问到很多次,也在以往的工作开发中多次使用这个框架来配合微服务的使用,理解最多的也就是通过main方法来使项目到运行状态,但对其原理还不是很清楚,今天我们就来深度分析下Spring boot到底是如何实现自动装配的,如有分析不对的地方希望大家给予指正🙏
首先我在项目中使用的Spring boo 版本是2.2.6.RELEASE
下面来看项目的启动方法
@SpringBootApplication
进入注解后会发现原来就是个Configuration配置类啊,会有3个核心注解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@ComponentScan
其中ComponentScan会扫描我们项目,Spring Boot主启动类的同级路径及子路径,主要就是扫描以下框出的部分。
@EnableAutoConfiguration
下面我们来说最核心的注解@EnableAutoConfiguration,这个是Spring Boot实现自动装配最核心的注解。
我们可以看到它通过@Import注解,注入了一个AutoConfigurationImportSelector的类,selectImports() 方法那么它返回了一个String的数组,这个数组就是来接受我们所需要装配的类。
继续看方法里面的代码发现getAutoConfigurationEntry()方法返回了AutoConfigurationEntry对象,这个类里面就是保存着我们的配置信息。 Configurations是我们的配置文件,其中入参还有Annotation(注解),看来我们的装配确实跟注解关系。
因为getCandidateConfigurations()这个方法返回了一个list集合的Configurations,所以我们要点进去看下这个方法到底做了些什么。
我们看到了loadFactoryNames()这个方法,那么这个方法一定帮助我们加载配置类的方法了。
loadSpringFactories()这个方法可以清楚的看到,先去本地缓存中拿需要加载的配置,如果缓存中有直接返回配置信息,如果cache里面没有再去我们META-INF/spring.factories目录下去拿到需要加载的配置类,通过ClassLoader类加载器进行加载。
我们进入jar包可以看到META-INF目录下的spring.factories文件第一行就是EnableAutoConfiguration这个注解。
最后总结
Spring Boot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件然后加载bean定义的过程,通过自动装配极大地简化了开发的流程。