面试终极宝典:Springboot自动装配原理
Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点。下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可。
Springboot自动装配过程:(每个步骤后的括号是对应的操作)
1. SpringBoot启动的时候会通过@EnableAutoConfiguration注解找到spring-boot-autoconfigure jar包下面的META-INF/spring.factories配置文件中的所有的EnableAutoConfiguration的配置,形成一个候选集;(getCandidateConfigurations(annotationMetadata, attributes)操作)
2. 接下来,先去除掉候选集中的一些重复的自动配置类,因为我们可能会在pom文件中重复引入;(removeDuplicates(configurations);)
3. 然后再根据exclusions排除掉不希望自动装配的类,这个exclusions可以在@EnableAutoConfiguration注解的exclude属性和excludeName属性中指定,也可以在properties文件中通过spring.autoconfigure.exclude来指定;(getExclusions(annotationMetadata, attributes))
4. 再就是根据在pom文件中引入的starter以及一些自定义的配置文件来过滤掉我们不希望进行自动加载的配置类;(getConfigurationClassFilter().filter(configurations))
5. 最后再去加载剩下的自动配置类。(fireAutoConfigurationImportEvents(configurations, exclusions))
上面的部分是话术,感兴趣的可以大致看下流程,相关代码如下:
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); } protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return EMPTY_ENTRY; } AnnotationAttributes attributes = getAttributes(annotationMetadata); List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); Set<String> exclusions = getExclusions(annotationMetadata, attributes); checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); configurations = getConfigurationClassFilter().filter(configurations); fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationEntry(configurations, exclusions); }
上述两个方法定义在AutoConfigurationImportSelector类中。