Spring Boot 的自动配置是通过 @EnableAutoConfiguration 注解实现的,它导入了 AutoConfigurationImportSelector 类,
负责扫描 classpath 下的 spring.factories 文件并加载相关的自动配置类。
这些配置类通过条件注解(如 @ConditionalOnClass 和 @ConditionalOnMissingBean)来灵活控制何时加载配置。
在启动时,Spring Boot 会根据项目的依赖和环境条件,自动选择并注入合适的 Bean,简化了配置过程。

📚 知识内容
Spring Boot 的自动配置功能是让开发者轻松配置应用的核心特性之一。通过自动化配置,开发者无需手动编写大量的配置代码,Spring Boot 会根据应用环境自动加载合适的 Bean,实现开箱即用的效果。

  1. @EnableAutoConfiguration 注解 🛠️
    这是实现自动配置的关键注解,通常与 @SpringBootApplication 注解一起使用。它引导 Spring Boot 在应用启动时,自动加载并注入各种所需的组件。这个注解背后使用了 AutoConfigurationImportSelector 类,它会扫描 spring.factories 文件,自动选择并加载配置类。

代码示例:

@EnableAutoConfiguration
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. spring.factories 文件 🔧
这个文件位于 META-INF 目录下,包含了自动配置类的注册信息。Spring Boot 启动时,AutoConfigurationImportSelector 会读取这个文件并加载相应的配置类,完成自动配置的工作。

示例:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
⚠️ 小贴士:spring.factories 文件是自动配置的核心之一,你可以在这里查看和修改自动配置类的加载顺序。

  1. 条件注解 - 灵活控制配置加载 📑
    自动配置类通常会使用条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean)来控制配置的加载条件。只有在符合特定条件时,自动配置才会生效。

例如,@ConditionalOnClass 注解确保配置类只有在类路径中存在指定类时才会被加载,而 @ConditionalOnMissingBean 则会检查容器中是否已经存在某个 Bean,如果没有则加载该 Bean。

代码示例:

@Configuration
@ConditionalOnClass(DataSource.class) // 只有当类路径中存在 DataSource 时才加载配置
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean // 如果没有自定义 DataSource,则使用默认配置
public DataSource dataSource() {
return new HikariDataSource();
}
}
4. 创建自定义自动配置 🛠️
你可以根据自己的需求创建自定义的自动配置类,这些配置类通常会使用 @Configuration 注解,并且配合条件注解控制配置是否加载。

示例:

@Configuration
@ConditionalOnClass(MyCustomService.class)
public class MyCustomAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyCustomService myCustomService() {
return new MyCustomService();
}
}
注意:自定义的自动配置类需要在 spring.factories 文件中注册,确保 Spring Boot 在启动时能够自动加载。

  1. 自动配置顺序控制 🔄
    有时我们需要控制自动配置类的加载顺序,这时可以使用 @AutoConfigureBefore 和 @AutoConfigureAfter 注解。它们允许我们明确指定某些配置类应该在其他配置类之前或之后加载。

代码示例:

@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class MyDataSourceAutoConfiguration {
// 自定义的数据源配置
}
6. 禁用自动配置 🚫
如果某些默认的自动配置与项目需求不符,我们可以通过以下两种方式禁用不需要的自动配置类:

在 application.properties 文件中禁用:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
使用 @SpringBootApplication 注解的 exclude 属性:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
🌱 知识拓展
Spring Boot 的自动配置使得应用能够快速启动,并且高度集成了各种常见的技术栈和服务,比如数据库连接池、消息队列、缓存等。开发者只需关注核心业务逻辑,基础设施的配置则交给 Spring Boot 来完成。

  1. 如何扩展自动配置?
    自定义自动配置类并通过 @Conditional 系列注解来灵活控制配置的加载。
    创建 spring.factories 文件,将自定义配置类注册进去。
  2. 自动配置的优势 🏆
    简化配置:开发者无需关心基础设施的配置,Spring Boot 会根据项目的依赖自动加载相应的配置。
    增强可扩展性:可以通过自定义自动配置类,扩展项目的功能并复用到其他 Spring Boot 应用中。
    高效的开发流程:减少了繁琐的配置代码,极大提高了开发效率。
  3. 与 Starter 的关系 💡
    Starter 是 Spring Boot 提供的功能集,通常包含一组预先配置好的自动配置类,开发者只需要引入相应的 Starter 依赖,就可以享受到完整的自动配置体验。例如,spring-boot-starter-data-jpa 会自动配置 JPA 和数据库连接池等相关 Bean。