當面試管問你springboot 和 普通spring 有什么區別?
您還在回答: 簡化了配置 ,內置tomcat 等等 嗎 ? 那只是皮毛, 最重要的還是自動化配置。一起來了解一下
第一步:
第二步:
第三步:
第四步:
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { private static final String[] NO_IMPORTS = new String[0]; private static final Log logger = LogFactory.getLog(AutoConfigurationImportSelector.class); private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude"; private ConfigurableListableBeanFactory beanFactory; private Environment environment; private ClassLoader beanClassLoader; private ResourceLoader resourceLoader; public AutoConfigurationImportSelector() { } public String[] selectImports(AnnotationMetadata annotationMetadata) { //很重要 if (!this.isEnabled(annotationMetadata)) { return NO_IMPORTS; } else { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = this.getAttributes(annotationMetadata); //去mata-info/spring.factories文件中 查詢 EnableAutoConfiguration對應得所有類 一共110個 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); //去除重復的配置類,若我們自己寫的starter 可能存主重復的 configurations = this.removeDuplicates(configurations); Set<String> exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); //根據maven 包導入的啟動器過濾出 需要導入的配置類 configurations = this.filter(configurations, autoConfigurationMetadata); this.fireAutoConfigurationImportEvents(configurations, exclusions); return StringUtils.toStringArray(configurations); } }
第五步:
xml 版配置:
整個springboot 自動配置得流程用以下得圖來概況: