一、Spring Boot 自动配置简介
Spring Boot 的自动配置功能旨在根据项目中的类路径、配置文件、环境变量等因素,自动地配置Spring框架的相关组件。这意味着开发者在大多数情况下不需要手动编写大量的配置代码,Spring Boot 会根据已有的约定自动完成这些配置。
二、自动配置的核心注解
1.@SpringBootApplication注解:
这是 Spring Boot 项目的启动类注解,它组合了 @SpringBootConfiguration
、@EnableAutoConfiguration
和 @ComponentScan
三个注解。
@SpringBootConfiguration
作用:
SpringBoot
的配置类 ,标注在某个类上 , 表示这是一个
SpringBoot
的配置类;
@ComponentScan
这个注解在
Spring
中很重要
,
它对应
XML
配置中的元素。
作用:自动扫描并加载符合条件的组件或者
bean
, 将这个
bean
定义加载到
IOC
容器中
@EnableAutoConfiguration
开启自动配置功能
2.@EnableAutoConfiguration 注解:
@EnableAutoConfiguration
注解通过
Spring
提供的
@Import
注解导入了
AutoConfigurationImportSelector
类(
@Import
注解可以导入配置类或者
Bean
到当前类中)。
AutoConfigurationImportSelector
是 Spring Boot 中一个重要的类,它实现了
Importselect
接口,用于实现自动配置的选择和导入。具体来说,它通过分析项目的类路径和条件来决定应该导入哪些自动配置类。
AutoConfigurationImportSelector
类中
getCandidateConfigurations
方法会将所有自动配置类的信息以 List
的形式返回。这些配置信息会被
Spring
容器作
bean
来管理。
大致流程如下:
我们来看一下
AutoConfigurationImportSelector 的关键源码
点进getAutofigurationEntry方法
再点进getCandidateConfigurations方法中
三、条件判断Conditional
对于每一个发现的自动配置类,AutoConfigurationImportSelector
会使用条件判断机制(通常是通过 @Conditional
注解)来确定是否满足导入条件。这些条件可以是配置属性、类是否存在、Bean是否存在等等,满足条件才会进行配置。
例如:
- ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
- ConditionalOnClass:当类路径下有指定类的条件下才初始化Bean
- ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下才初始化Bean
- ConditionalOnBean:当容器里有指定 Bean 的条件下才初始化Bean
四、总结原理
- @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class) 来加载配置类。
- 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean
- 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean