Spring Boot自动配置原理
自动配置是Spring Boot的核心特性之一,它能够根据你添加的jar依赖自动配置你的Spring应用 。简单来说,就是"约定优于配置"——Spring Boot会基于类路径中的内容、已有的bean定义和各种属性设置,自动为你配置Spring应用。
自动配置的工作原理
1. @SpringBootApplication注解
当你创建一个Spring Boot应用时,主类上会有@SpringBootApplication注解。这个注解实际上是一个组合注解,包含三个核心注解:
@SpringBootConfiguration:标识这是一个配置类@EnableAutoConfiguration:启用自动配置机制@ComponentScan:启用组件扫描
@SpringBootApplication //标识这是一个配置类
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. @EnableAutoConfiguration的关键作用
@EnableAutoConfiguration注解会导入AutoConfigurationImportSelector类,这个类会从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中加载自动配置类,这些自动配置类通常以XXXAutoConfiguration命名。
3. 条件化配置
自动配置类使用大量的@Conditional注解来决定是否生效,常见的有:
@ConditionalOnClass:当类路径下有指定的类时生效@ConditionalOnMissingBean:当容器中没有指定Bean时生效@ConditionalOnProperty:当指定的属性有指定的值时生效
例如,DataSource自动配置:
//表明这是一个Spring配置类
@Configuration
//只有当类路径中存在DataSource类和EmbeddedDatabaseType类时,这个自动配置类才会生效
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
//将application.properties或application.yml中以spring.datasource为前缀的属性绑定到DataSourceProperties类的实例
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// ...
}
4. spring.factories文件
Spring Boot自动配置的核心机制依赖于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,该文件列出了所有的自动配置类。
总结
自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解底层包含了3个注解,分别是:
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
@EnableAutoConfiguration这个注解才是自动配置的核心。
- 它封装了一个@Import注解,Import注解里面指定了一个ImportSelector接口的实现类。
- 在这个实现类中,重写了ImportSelector接口中的selectImports()方法。
- 而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC容器进行管理。
- 那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。
- @Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是 ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector 接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将哪些类交给 spring 的 IOC容器进行管理。
- 此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是 autoConfiguration.imports。而在 autoConfiguration.imports 这份儿文件当中,它就会去配置大量的自动配置的类。
- 而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上这么一类@Conditional 开头的注解。这个注解就是进行条件装配。所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这个bean,才会将这个 bean 交给 IOC 容器管理。
Spring Boot自动配置的核心思想:
- 通过类路径检测确定需要的功能
- 通过条件注解决定是否应用配置
- 提供合理的默认值
- 允许开发者轻松覆盖默认配置