Java面试经常会问到SpringBoot自动配置原理,下面我就来详解SpringBoot自动配置原理@mikechen
什么是springboot自动配置
Spring Boot的自动配置是一种机制,它可以根据应用程序的依赖关系和环境自动配置Spring应用程序所需的组件。
简单来说,Spring Boot的自动配置就是在Spring应用程序启动时自动为应用程序进行配置。
springboot自动配置注解
我们开发任何一个Spring Boot项目,都会用到如下的启动类:
我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,如下图所示:
在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实现自动装配的所有处理逻辑,包括:
- 获得候选配置类;
- 配置类去重;
- 排除不需要的配置类;
- 过滤等;
最终返回符合条件的自动配置类的全限定名数组。
@EnableAutoConfiguration,就像一只“八爪鱼”一样,如下图所示:
借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成。
当应用程序启动时,Spring Boot会自动扫描应用程序的依赖,根据依赖中的类和类路径上的元数据(比如META-INF/spring.factories文件)来决定哪些配置类应该被加载。
以上就是springboot自动配置原理详解,更多内容请查看:SpringBoot框架教程(详细图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》