Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Spring Boot 自动配置怎样工作?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

启动入口导入自动配置候选,再按类路径、已有对象、属性和应用类型等条件筛选,符合条件的配置向容器提供 Bean。用户显式配置常可使对应默认配置退让,但要看具体条件。自动配置不是替你猜业务,也不是扫描所有依赖类后全部实例化。

讲清原理

当前候选通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 等约定登记;旧 spring.factories 自动配置候选写法不能直接套到Boot4。Boot4模块拆分后,所需技术的自动配置也要有相应模块。

常见 ConditionalOnClass 检查类型是否存在,ConditionalOnMissingBean 检查是否缺少匹配对象,ConditionalOnProperty 检查属性条件。配置类的先后影响条件观察结果,不等同于所有Bean初始化顺序。

候选配置经过条件筛选,缺省对象可让给用户配置
候选配置经过条件筛选,缺省对象可让给用户配置

例子与易错点

启动时可查看条件评估报告,确认为什么匹配或不匹配,而不是靠反复排除配置类碰运气。测试自定义默认Bean时,要同时验证默认生成、用户覆盖和条件关闭三种情况。

以下为 Java 21 类成员示例,放入同一外部类中使用,依赖 Boot4.1.2 / Framework7.0.10。显式导入自定义自动配置,验证默认、用户覆盖与关闭;不声称测试了所有技术模块候选发现。

interface Greeting { String text(); }
@org.springframework.boot.autoconfigure.AutoConfiguration
static class GreetingDefaults {
    @org.springframework.context.annotation.Bean
    @org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean(Greeting.class)
    @org.springframework.boot.autoconfigure.condition.ConditionalOnProperty(
        name="lesson16.greeting.enabled",havingValue="true",matchIfMissing=true)
    Greeting greeting() { return () -> "default"; }
}
@org.springframework.context.annotation.Configuration(proxyBeanMethods=false)
@org.springframework.boot.autoconfigure.ImportAutoConfiguration(GreetingDefaults.class)
static class Config { }
static java.util.List<String> greetings(boolean userDefined,boolean enabled) {
    try (var context=new org.springframework.context.annotation.AnnotationConfigApplicationContext()) {
        context.getEnvironment().getPropertySources().addFirst(
            new org.springframework.core.env.MapPropertySource("flags",
                java.util.Map.of("lesson16.greeting.enabled",enabled)));
        if (userDefined) context.registerBean("userGreeting",Greeting.class,() -> () -> "user");
        context.register(Config.class);context.refresh();
        return context.getBeansOfType(Greeting.class).values().stream().map(Greeting::text).toList();
    }
}

相关题:第 2 题、第 3 题、第 6 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。