自动配置原理
hello world程序
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
System.out.println("debug");
SpringApplication.run(DemoApplication.class, args);
}
}
- 从SpringBootApplication开始看
@SpringBootApplication -> @EnableAutoConfiguration开启自动配置 -> @AutoConfigurationPackage/@Import(AutoConfigurationImportSelector.class) ->port(AutoConfigurationPackages.Registrar.class)
自动包扫描
/**
* {@link ImportBeanDefinitionRegistrar} to store the base package from the importing
* configuration.
*/
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
- metadata拿到了注解信息, 其中
PackageImports(metadata).getPackageNames().toArray(new String[0])这一句拿到了启动类所在的包名, 因此springboot自动扫描将会扫描这里"com"包下所有的文件夹和所有的类, 扫描到是
组件的将加入容器
扫描依赖包名
- @Import(AutoConfigurationImportSelector.class) 其中给的内部类AutoConfigurationEntry包含了所有自动导入包的信息, 自动配置类
0 = "org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration"
1 = "org.springframework.boot.autoconfigure.aop.AopAutoConfiguration"
2 = "org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration"
3 = "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration"
4 = "org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration"
5 = "org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration"
6 = "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration"
7 = "org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration"
8 = "org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration"
9 = "org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration"
10 = "org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration"
11 = "org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration"
扫描META-INF/spring.factories
loadSpringFactories方法拿到properties值从spring.factories中
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
...
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
...
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
spring-boot-autoconfigure-2.3.2.RELEASE.jar 包下的spring.factories 涵盖所有自动配置类
# AutoConfigureCache auto-configuration imports
org.springframework.boot.test.autoconfigure.core.AutoConfigureCache=\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
# AutoConfigureDataJdbc auto-configuration imports
org.springframework.boot.test.autoconfigure.data.jdbc.AutoConfigureDataJdbc=\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration