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对应的类全限定名取出来,即各组件的配置类,然后加载到容器中的整个过程