SpringBoot入门 自动配置(一)

210 阅读1分钟

自动配置原理

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