Java: Spring Boot自动配置的实现原理

Spring Boot 版本: 2.1.4.RELEASE

配置了内存数据库EmbeddedDatabaseConnection 加载.

Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

自动配置: 基于CLASSPATH上出现的类,application.properties或者环境上下文出现的配置.作为依据,对spring-boot做出自动配置.

代码在:spring-boot-autoconfiguration包中.

开启自动配置: @EnableAutoConfiguration

排除指定的类: exclude=Class<?>[]

java标志
image-2769

自动配置实现原理

使用各种条件注解

  1. @Conditional
  2. @ConditionalOnClass
  3. @ConditionalOnBean
  4. @ConditionalMissingBean
  5. @ConditionalOnProperty
  6. ……

加载META-INF/spring.factories文件中的类

@EnableAutoConfiguration注解中,引入了AutoConfigurationImportSelector在getCandidateConfigurations()方法中,使用了SpringFactoriesLoader类加载META-INF/spring.factories配置文件,并指定需要加载的配置键为AutoConfigurationImportSelector类的:getSpringFactoriesLoaderFactoryClass()方法的返回值,也就是EnableAutoConfiguration.class;

也就是通过这个方法,SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());获取到需要自动配置的类的信息.

在Spring Boot中,META-INF/spring.factories的文件内容如下:

其中org.springframework.boot.autoconfigure.EnableAutoConfiguration下面的条目是Spring Boot提供的自动配置的类: