Spring Boot 自动配置怎样工作?
查看完整题解
参考回答
直接回答
启动入口导入自动配置候选,再按类路径、已有对象、属性和应用类型等条件筛选,符合条件的配置向容器提供 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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。