自动配置是Spring Boot的"魔法"所在。面试官用这题区分"会用Spring Boot"和"真懂Spring Boot"——答好需要理解classpath扫描、SPI加载、条件化注册和执行顺序,是框架深度的标志。
入口:@SpringBootApplication是组合注解,= @Configuration + @ComponentScan + @EnableAutoConfiguration。
@EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector。这个Selector读classpath下每个jar的META-INF/spring.factories(Boot 2.7+换成META-INF/spring/...AutoConfiguration.imports)。
每个声明的auto-config类都被大量@Conditional家族注解修饰:@ConditionalOnClass(某类存在才生效)、@ConditionalOnMissingBean(用户没定义才生效)、@ConditionalOnProperty(某配置存在才生效)等。
用户优先:自定义了DataSource @Bean时,@ConditionalOnMissingBean会让Boot的默认DataSourceAutoConfiguration跳过。
调试神器:启动加--debug会打印AUTO-CONFIGURATION REPORT,列出所有候选配置类、是否命中、哪个条件没过。排查"为什么没生效"30秒搞定。
Spring Boot的魔法是分层的。@SpringBootApplication其实是三个注解的组合:@Configuration(本类定义bean)、@ComponentScan(扫描包里的@Component、@Service等)、@EnableAutoConfiguration(核心魔法)。@EnableAutoConfiguration内部用@Import(AutoConfigurationImportSelector.class)。AutoConfigurationImportSelector是DeferredImportSelector,在用户所有@Configuration处理完后才跑。它读classpath上每个jar的META-INF/spring.factories——Boot 2.7+搬到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。每个starter jar在这里声明自己提供的auto-config类:比如spring-boot-starter-web的jar里声明了WebMvcAutoConfiguration、DispatcherServletAutoConfiguration等。但声明不等于生效——每个auto-config类都被大量条件注解修饰:@ConditionalOnClass(DispatcherServlet.class)意思是只有Spring MVC在classpath上才生效;@ConditionalOnMissingBean意思是用户没定义这个bean时才创建默认的;@ConditionalOnProperty("spring.datasource.url")意思是配置文件里有这个property时才生效。这三层——classpath有没有、用户有没有定义bean、有没有对应property——叠加起来就是Spring Boot"自动配好又不挡路"的感觉。你往pom.xml加了MySQL驱动,DataSourceAutoConfiguration的@ConditionalOnClass(DataSource.class)为true;它按spring.datasource.*配置出一个HikariCP DataSource。如果你自己定义了DataSource @Bean,@ConditionalOnMissingBean让默认配置跳过。最实用的调试工具是--debug启动参数,会打印AUTO-CONFIGURATION REPORT,列出每个候选auto-config是否命中、没命中的话哪个条件失败了。"为什么我的DataSource没被配",看这个报告30秒找到原因。
能点名具体的条件注解(@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty)比笼统答好很多。
提到Boot 2.7+从spring.factories迁到AutoConfiguration.imports,是跟进新版本的信号。
--debug / AUTO-CONFIGURATION REPORT作为实战调试技巧是差异化加分项。
忘了文件名,即答侠可以实时提示spring.factories和AutoConfiguration.imports。
@Configuration是用户声明的配置类,Spring无条件加载。自动配置类是Spring Boot根据classpath和属性有条件注册的。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}),或者配spring.autoconfigure.exclude。
因为auto-config通过DeferredImportSelector加载,在用户@Configuration之后处理,判定时用户的bean已经注册完了。