Spring Boot 自动配置原理(能讲到 starter 就行)
自动配置是 Spring Boot 的核心卖点。面试不必背完整源码链,把 @SpringBootApplication → 扫包 → 加载 AutoConfiguration → 条件注解 说清楚,再举一个
redis-spring-boot-starter的例子就够。
题目
你了解的 Spring Boot 自动配置原理?
参考答案(口述要点)
@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan@EnableAutoConfiguration通过AutoConfigurationImportSelector读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(旧版是spring.factories)里的配置类- 配置类上的
@ConditionalOnClass、@ConditionalOnMissingBean等决定要不要生效- 我们引入
spring-boot-starter-data-redis就自动配好RedisTemplate,没 Bean 才配,有自己 Bean 就用我们的
详细解析
启动入口
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}条件装配示例(简化理解)
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
return template;
}
}含义:classpath 有 Redis 类,且用户没自己定义 redisTemplate 时,才帮你建默认 Bean。
常用条件注解
| 注解 | 含义 |
|---|---|
@ConditionalOnClass | 存在某类才配置 |
@ConditionalOnMissingBean | 容器里没有该 Bean 才配置 |
@ConditionalOnProperty | 配置项为 true 才配置 |
代码与实践
自定义 starter(简历可写「了解」)
xxx-spring-boot-autoconfigure:写XxxAutoConfiguration+META-INF/spring/...AutoConfiguration.importsxxx-spring-boot-starter:依赖 autoconfigure,业务只引 starter
排查「自动配置没生效」
debug: true启动日志里看 Positive matches / Negative matches,或 Actuator /actuator/conditions(若开了)。
和 @Configuration 区别:自动配置是 约定大于配置,减少 XML;业务仍可用 @Configuration 显式 @Bean 覆盖。
写在最后
原理题说到 条件注解 + imports 文件 + 可覆盖 三层,面试官一般就停了;别硬背 SpringFactoriesLoader 每一行,除非对方深挖源码。
创作不易,转载请注明出处和作者。
