14、自动配置【源码分析】-初始加载自动配置类
14、自动配置【源码分析】-初始加载自动配置类
Spring Boot的自动配置功能通过智能地加载和配置组件,极大地简化了应用的初始化过程。以下是初始加载自动配置类的详细原理:
### 1. 启动应用
当执行 `SpringApplication.run()` 方法启动Spring Boot应用时,初始化过程开始。
### 2. `@SpringBootApplication` 注解
- **`@SpringBootApplication`** 是一个复合注解,包含了:
- **`@EnableAutoConfiguration`**:启用自动配置功能。
- **`@ComponentScan`**:默认扫描启动类所在包及其子包下的组件。
### 3. `@EnableAutoConfiguration` 注解
- **`@Import(AutoConfigurationImportSelector.class)`**:
- 通过 `@Import` 注解引入 `AutoConfigurationImportSelector` 类,负责加载自动配置类。
### 4. `AutoConfigurationImportSelector` 类
- **`selectImports()` 方法**:
1. **加载候选自动配置类**:
- 从 `META-INF/spring.factories` 文件中读取 `org.springframework.boot.autoconfigure.EnableAutoConfiguration` 键对应的所有自动配置类名。
- 该文件位于各个依赖的 `jar` 包中,列出了所有可用的自动配置类。
2. **条件过滤**:
- 使用 `@Conditional` 系列注解对候选配置类进行过滤,例如:
- **`@ConditionalOnClass`**:当类路径中存在指定类时,配置类生效。
- **`@ConditionalOnMissingBean`**:当容器中不存在指定类型的 Bean 时,配置类生效。
- **`@ConditionalOnProperty`**:根据配置文件中的属性值决定是否生效。
- 只有满足条件的自动配置类才会被保留。
### 5. 加载并注册自动配置类
- 将符合条件的自动配置类注册到 Spring 容器中。
- 这些自动配置类通常使用 `@Bean` 注解定义需要自动配置的组件,例如数据源、Web MVC 等。
### 6. 示例:`DataSourceAutoConfiguration`
- **自动配置数据源**:
- 当引入数据库相关依赖(如 `spring-boot-starter-jdbc`)且配置文件中提供了数据库连接信息时,`DataSourceAutoConfiguration` 会被加载。
- 它根据条件注解判断是否需要自动配置数据源,并在满足条件时创建数据源 Bean。
### 总结
- **初始加载自动配置类的流程**:
1. 通过 `@EnableAutoConfiguration` 引入 `AutoConfigurationImportSelector`。
2. 从 `META-INF/spring.factories` 加载候选自动配置类。
3. 使用 `@Conditional` 注解进行条件过滤,仅保留符合条件的配置类。
4. 将符合条件的自动配置类注册到 Spring 容器,完成自动配置。
通过这一机制,Spring Boot 实现了智能化的组件自动配置,减少了开发人员的手动配置工作,提高了开发效率。