SpringBoot自动装配原理

SpringBoot自动装配是一种约定大于配置的体现,SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration。
在这个@EnableAutoConfiguration中,有一个Import注解,它注入了AutoConfigurationImportSelector这个导入选择器。而这个选择器,它里面有一个selectImports方法,它可以根据用户自定义的逻辑,将所有需要导入的组件以全类名的方式返回一个数组,这些组件就会被添加到容器中。(如果不了解这个注解的同学可以看一下我的这篇文章 https://www.jianshu.com/p/07ddd99cb58b)
这就是那个selectImports方法

image.png

很明显,返回的数组中的内容都是在这一行代码中获取到的

AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);

我们点进去看一下


image.png

我们可以发现,在这里已经读取到了我们所有需要自动装配的组件,而这个configurations是从这一行代码中获取到的

List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

点进去看一下

protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

然后我们就可以发现,这里使用了SPI这种机制,Spring会从META-INF/spring.factories中获取资源,然后通过Properties加载资源:

image.png

image.png

我们可以来看一下这种spring.factories文件里有什么
image.png

我们可以看到这里有大量的需要自动装配的值,Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了
而且每一个这样的AutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做配置,帮助我们完成自动装配。
我们可以随便找一个自动配置类看看
image.png

我们可以发现,只要满足这些Conditional条件,这个类中的这些@Bean就会被自动装配。
好,我们总结一下。Spring Boot在启动的时候从类路径下的METAINF/spring.factories中获取EnableAutoConfiguration指定的值,并返回给SpringBoot启动类下的ImportSelect选择器,若这些自动配置类中的条件注解也符合,Spring就会把这些自动配置类注入到我们的容器中,给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以自定义这些属性的值,自动配置就完成了

你可能感兴趣的:(SpringBoot自动装配原理)