SpringBoot源码 - 自动配置原理

  • 打开主程序的代码,如下:

    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            SpringApplication.run(MainApplication.class, args);
        }
    }
    

    可以看到主程序很简单,只有一个注解 @SpringBootApplication,这就是springboot启动的核心

  • 点击 @SpringBootApplication 进去,可以发现它是一个组合注解,包括两个核心注解:

    @SpringBootConfiguration
    @EnableAutoConfiguration
    public @interface SpringBootApplication {……}
    
  • 点击@SpringBootConfiguration 进去,可以看到它只有一个注解@Configuration:

    @Configuration
    public @interface SpringBootConfiguration {……}
    

    @Configuration 代表着这是一个 Spring 配置类,可以认为 @SpringBootConfiguration = @Configuration

  • 再点击另一个注解 @EnableAutoConfiguration进去看,可以看到包含两个注解

    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {……}
    

    点击 @AutoConfigurationPackage 进去,可以看到:

    @Import({Registrar.class})
    public @interface AutoConfigurationPackage {……}
    

再点 Registrar 进去,看到这个方法:

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
   AutoConfigurationPackages.register(registry, (String[])(new        AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}

默认情况下,就是将主配置类(@SpringBootApplication)所在的包以及子包里的组件扫描到容器中。

回到EnableAutoConfiguration,点击 AutoConfigurationImportSelector 进去,可以看到有个 getCandidateConfigurations()方法,可以通过里面的loadFactoryNames()获取所有配置:

List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());

再点开 SpringFactoriesLoader.loadFactoryNames()方法,可以看到:

加载的配置资源位置.jpg

而在 SpringFactoriesLoader.loadFactoryNames() 方法参数中点开 getSpringFactoriesLoaderFactoryClass(),返回的是EnableAutoConfiguration.class:

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        return EnableAutoConfiguration.class;
}

也就是导入资源类,在 META-INF/spring.factories 中找,把key为 EnableAutoConfiguration 的资源加载进来:

spring-factories.jpg

但是,spring.factories中这么多配置,并不会在启动的时候全部加装,打开RedisAutoConfiguration ,可以看到:

redis加载条件.jpg

所以是通过 @ConditionalOnClass 注解判断是否加装该配置

自动配置加载过程如下:

自动配置流程.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容