Springboot自动配置原理

工作原理

新建一个spirngboot项目,在启动类上可以看到一个@SpringBootApplication注解。

Springboot自动配置原理解析

这是spirngboot自动配置的关键所在,点进去发现它里面包含了3个重要的注解。

Springboot自动配置原理解析

@SpringBootConfiguration: 本质上就是一个@Configuration,二者功能也一致,标注当前类是配置类 ( 使用Configuration配置类等同于XML文件 )

@EnableAutoConfinguration:开启自动配置(主要看这个)

@ComponentScan : 自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到Spring容器中。

自动配置原理

​ 在SpringBoot启动的时候,加载主配置类过程中,开启了自动配置的功能**@EnableAutoConfiguration**,该注解通过AutoConfigurationImportSelector给容器中导入一些自动配置的组件
Springboot自动配置原理解析

AutoConfigurationImportSelector调用selectImports(),再调用**getAutoConfigurationEntry()**去加载所有候选的主动配置信息
Springboot自动配置原理解析

getCandidateConfigurations()其中核心方法SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class , ClassLoader)。通过loadSpringFactories(classLoader)加载spring-boot-autoconfigure.jar包下META-INF/spring.factories,读取org.springframework.boot.autoconfigure.EnableAutoConfiguration这个key对应的所有自动配置类的完整包路径 。

Springboot自动配置原理解析

这个spring.factories文件也是一组一组的key=value的形式,其中一个keyEnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:

Springboot自动配置原理解析

自动配置生效

每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,常见的条件注解有如下几项:

@ConditionalOnBean:当容器里有指定的bean的条件下。

@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。

@ConditionalOnClass:当类路径下有指定类的条件下。

@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。

以RedisAutoConfiguration配置类为例,解释一下全局配置文件中的属性如何生效, 比如:server.port=8081,是如何生效的(当然不配置也会有默认值,这个默认值来自于org.apache.catalina.startup.Tomcat)。
Springboot自动配置原理解析

在RedisAutoConfiguration类上,有一个@EnableConfigurationProperties注解:开启配置属性,而它后面的参数是一个ServerProperties类,这就是习惯优于配置的最终落地点。

Springboot自动配置原理解析

在这个类上,我们看到了一个非常熟悉的注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,而**@EnableConfigurationProperties负责导入这个已经绑定了属性的bean到spring容器中(见上面截图)。 那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties**类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。

Springboot自动配置原理解析

至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。

而诸多的XxxxAutoConfiguration自动配置类,就是Spring容器的JavaConfig形式,作用就是为Spring 容器导入bean,而所有导入的bean所需要的属性都通过xxxxProperties的bean来获得。

总结

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

我的学习地址:

(https://zhuanlan.zhihu.com/p/55637237)
(https://blog.csdn.net/u014745069/article/details/83820511)
(https://blog.csdn.net/m0_37923316/article/details/107145955)

相关文章: