SpringBoot自动配置原理(图文详解)

SpringBoot自动配置原理(图文详解)-mikechen

Java面试经常会问到SpringBoot自动配置原理,下面我就来详解SpringBoot自动配置原理@mikechen

什么是springboot自动配置

Spring Boot的自动配置是一种机制,它可以根据应用程序的依赖关系和环境自动配置Spring应用程序所需的组件。

简单来说,Spring Boot的自动配置就是在Spring应用程序启动时自动为应用程序进行配置。

 

springboot自动配置注解

我们开发任何一个Spring Boot项目,都会用到如下的启动类:

SpringBoot自动配置原理(图文详解)-mikechen

我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,如下图所示:

SpringBoot自动配置原理(图文详解)-mikechen

在Spring Boot自动配置就是通过上图的:@EnableAutoConfiguration注解实现的。

 

springboot自动配置原理

通过上面的注解演示,我们知道了Spring Boot自动配置是通过@EnableAutoConfiguration注解实现的。

这个注解是帮助我们自动加载默认配置的,它里面有两个关键注解@AutoConfigurationPackage和@Import。

我们再进一步,点进该注解,可以看到@EnableAutoConfiguration包含:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

这里导入AutoConfigurationImportSelector类,这个类中有一个非常重要的方法:selectImports。

如下所示:

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //检查自动配置功能是否开启,默认开启
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        //加载自动配置的元信息
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                .loadMetadata(this.beanClassLoader);
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        //获取候选配置类
        List<String> configurations = getCandidateConfigurations(annotationMetadata,
                attributes);
        //去掉重复的配置类
        configurations = removeDuplicates(configurations);
        //获得注解中被exclude和excludeName排除的类的集合
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        //检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常
        checkExcludedClasses(configurations, exclusions);
        //从候选配置类中去除掉被排除的类
        configurations.removeAll(exclusions);
        //过滤
        configurations = filter(configurations, autoConfigurationMetadata);
        //将配置类和排除类通过事件传入到监听器中
        fireAutoConfigurationImportEvents(configurations, exclusions);
        //最终返回符合条件的自动配置类的全限定名数组
        return StringUtils.toStringArray(configurations);
    }

selectImports实现自动装配的所有处理逻辑,包括:

  1. 获得候选配置类;
  2. 配置类去重;
  3. 排除不需要的配置类;
  4. 过滤等;

最终返回符合条件的自动配置类的全限定名数组。

@EnableAutoConfiguration,就像一只“八爪鱼”一样,如下图所示:

SpringBoot自动配置原理(图文详解)-mikechen

借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成。

当应用程序启动时,Spring Boot会自动扫描应用程序的依赖,根据依赖中的类和类路径上的元数据(比如META-INF/spring.factories文件)来决定哪些配置类应该被加载。

以上就是springboot自动配置原理详解,更多内容请查看:SpringBoot框架教程(详细图文详解)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法