1.前言
自动装配则是 SpringBoot 的核心,自动装配是如何实现的呢?为什么我们只要引入一个 starter 组件依赖就能实现自动装配呢,接下来就让我们一起来探讨下 SpringBoot 的自动装配机制
2.自动装配原理
提到自动装配,那么你首先得知道spring的SPI(serviceproviderinterface)机制,因为自动装配的完成就是靠SPI机制完成的。
接下来咱就详细分解下自动装配的原理过程
2.1@SpringBootApplication注解
spingBootApplication 注解是springBoot的核心,此注解为复合注解。如下图,其中@EnableAutoConfiguration注解又是实现自动装配的关键。
2.2@EnableAutoConfiguration注解
如图:此注解也是一个复合注解,其中@Import也是实现自动装配的关键,个人认为这是一个最核心的注解。有时间,我会单独写一篇博客来针对此注解进行讲解。注意看:此注解中的value为:AutoConfigurationImportSelector.class。其实呢,@Import注解的value为一个class 数组,这里并未看出,其实可以写多个
2.3AutoConfigurationImportSelector
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry 是这里的核心。
这里做了两件事情:
1.加载了各个模块下的spring.factories文件
2.将spring.facrotries中加载的全限定类名去重,并将带有@excule的注解刨除掉。
2.4 如何加载各个模块下的spring.factories文件的呢?
我们可以追溯org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations方法
在org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories中找到了加载spring.factroies的地方 其中FACTORIES_RESOURCE_LOCATION =META-INF/spring.factories 也就是说我们的spring.factories的存放路径及名称都需要遵守这个规则
这里加载完成之后是spring.factorties里的所有值,之后会把enableAutoConfiguration的值过滤出来,然后加载到容器中。
下面看下我们加载到了什么:可以看到,这些***AutoConfiguration 类就是各个组件的配置类,这也就是为什么springBoot不需要再编写那么的xml的原因。
2.5 拿到spring.factories 关于enableAutoConfiguration的值并过滤后各组件的的配置类是如何加载到spring 容器中的呢?
可以看到 我们的AutoConfigurationImportSelector 实现了DeferredImportSelector接口,而此接口继承了ImportSelector接口。
ImportSelector接口:定义了selectImports接口方法,此方法返回了要加载进容器中的类的全限定名,
至此,我们知道了springBoot 是如何一步步找到各组件的spring.facatories,并将autoAutoConfiguration对应的类全限定名取出来,即各组件的配置类,然后加载到容器中的整个过程