自动装配可以说是SpringBoot的核心,在使用SpringBoot时不需要像Spring那样配置XML了。接下来就一起看看SpringBoot是怎么做到自动装配的,这也是面试容易被提问的点🥑
SpringBoot 是如何实现自动装配的?
首先看一下启动类中的@SpringBootApplication注解,通过@EnableAutoConfiguration来启用 SpringBoot 的自动配置机制。
所以我们从这个注解开始🍆
@AutoConfigurationPackage 是指定SpringBoot的扫描包,默认就是启动类所在包下的所有组件。
所以我们的重点是在AutoConfigurationImportSelector类。它实现了DeferredImportSelector接口中的selectImports方法。
该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。
看一下getAutoConfigurationEntry方法🌽
getCandidateConfigurations方法获取需要自动装配的所有配置类,读取META-INF/spring.factories。以引入的Druid为例,就知道该文件的位置了🥬
在loadFactoryNames中
- 从当前项目的类路径中获取所有 META-INF/spring.factories 这个文件下的信息。
- 将上面获取到的信息封装成一个 Map 返回。
- 从返回的 Map 中通过刚才传入的 EnableAutoConfiguration.class 参数,获取该 key 下的所有值。
再来看一下spring.factories文件
这就是druid自动装配的类
SpringBoot在加载时会筛选满足@ConditionalOnMissingBean或者类似注解的条件🌰