• @Import(AutoConfigurationImportSelector.class)
      1. 利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
      2. 调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类。
      3. 利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
      4. META-INF/spring.factories位置来加载一个文件。
        • 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
        • spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

    image.png

    1. # 文件里面写死了spring-boot一启动就要给容器中加载的所有配置类
    2. # spring-boot-autoconfigure-2.3.4.RELEASE.jar/META-INF/spring.factories
    3. # Auto Configure
    4. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    5. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
    6. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
    7. ...

    虽然我们127个场景的所有自动配置启动的时候默认全部加载,但是xxxxAutoConfiguration按照条件装配规则(@Conditional),最终会按需配置。

    如AopAutoConfiguration类:

    1. @Configuration(
    2. proxyBeanMethods = false
    3. )
    4. @ConditionalOnProperty(
    5. prefix = "spring.aop",
    6. name = "auto",
    7. havingValue = "true",
    8. matchIfMissing = true
    9. )
    10. public class AopAutoConfiguration {
    11. public AopAutoConfiguration() {
    12. }
    13. ...
    14. }