Spring Boot 的自动配置是如何实现的

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

Spring Boot 的自动配置实现

Spring Boot 的自动配置是其最核心的功能之一,它可以大幅度简化我们的配置过程。通过自动配置,开发者可以省去大量手动定义Beans和导入依赖的过程。自动配置允许我们基于classpath中的jar依赖自动配置Spring应用。下面我们来深入了解它是如何实现的。

基本原理

Spring Boot的自动配置是通过**@EnableAutoConfiguration注解来开启的。当我们在项目中添加Spring Boot Starter依赖时,这个注解通常会通过@SpringBootApplication**被引入。

@SpringBootApplication
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}

@SpringBootApplication注解是一个组合注解,它集成了以下三个注解:

  • @SpringBootConfiguration: 继承自@Configuration,标记当前类为配置类。

  • @EnableAutoConfiguration: 开启自动配置的关键。

  • @ComponentScan: 默认扫描当前包下所标有@Component的类。

@EnableAutoConfiguration的工作机制

@EnableAutoConfiguration背后的关键是spring.factories文件。在Spring Boot的jar包中,每一个jar文件的META-INF目录下都可能含有一个spring.factories文件,这个文件包含了一系列的配置项。

探究**@EnableAutoConfiguration注解,我们会发现它最终会导致 org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector 类的调用。这个类负责从所有的spring.factories**文件中读取并汇总EnableAutoConfiguration键所对应的配置类。

条件化的配置

自动配置类通常配合了 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty 等注解使用,只有在特定条件满足的情况下,对应的配置才会生效。

举个例子,如果你的classpath下存在 H2 数据库的类,并且你没有在你的配置中定义DataSource Bean,Spring Boot 自动配置就会尝试配置一个内存内的H2 DataSource。

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
public class H2AutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        // ...创建并返回H2 DataSource的实例
    }
}

这种机制能确保不会干扰到开发者自己配置的Beans,同时又能在需要时提供快速的开箱即用体验。

自定义自动配置

开发者还可以定义自己的自动配置类,并通过在spring.factories中指定来进行加载。

# src/main/resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.myapp.autoconfigure.MyAutoConfiguration

总结

Spring Boot的自动配置使得开发者能更快速地构建应用,同时为自动配置提供了条件化配置和自定义配置的高度灵活性。通过对启动过程和条件注解的深入理解,我们可以充分利用Spring Boot提供的这一强大功能。

最后更新于