boot项目创建时需要创建一个主程序类并且加上@SpringBootApplication就可以独立运行,是因为其自动导入了Tomcat,那它是怎么导进去的呢,咱们进入注解@SpringBootApplication看看
其中注解@SpringBootConfiguration是SpringBoot的注解,声明这个类是个配置类,和Spring的@Configuration是一个作用;
@EnableAutoConfiguration的作用是开启自动注解,我们看看这个注解的内容
@AutoConfigurationPackage的作用是将主配置类(@SpringBootApplication注解的类)的所在包及下面所有子包的组件都扫描到容器,@Import是Spring的导入包注解,我们看看类EnableAutoConfigurationImportSelector
public class EnableAutoConfigurationImportSelector
extends AutoConfigurationImportSelector {
@Override
protected boolean isEnabled(AnnotationMetadata metadata) {
if (getClass().equals(EnableAutoConfigurationImportSelector.class)) {
return getEnvironment().getProperty(
EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class,
true);
}
return true;
}
}
其中配置文件中的属性EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY的值,就是要导入的包,我们看看这个类的父类AutoConfigurationImportSelector
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
我们可以看见configurations在后面的代码中都用到了,所以这个值就是返回的要导入的jar包,进入这个方法寻找会发现它读取的了配置文件META-INF/spring.factories,这个配置文件在spring-boot-autoconfigure下,然后进去寻找属性对应的值,会发现很多要导入的包
项目在启动的时候会自动导入这些包,boot项目的自动配置原理就介绍完了